2017-10-05 18 views
2

我的任务是将运行在azure/iis中的php应用程序迁移到nginx + fpm组合一台GNU + Linux机器。IIS到nginx迁移:`意外'{“`erron on d {^ anum ^,^ anum ^}条目映射文件

web.config包含:

<rule name="Some match"> 
<match url=".*"/> 
<conditions> 
<add input="{URL}" pattern="^power_ranger/(\d{4,9})$" /> 
</conditions> 
<action type="Rewrite" url="/power_ranger.php?ranger={C:1}"/> 
</rule> 

后来跟随我创建了一个名为rewrites.map下列地图文件中https://serverfault.com/questions/441235/maintaining-redirects-in-nginx-from-an-external-source#441517看到的指令:

^power_ranger/(\d{4,9})$ /power_ranger.php?ranger=$2 

而且对虚拟主机的配置,我把以下内容:

map $uri $new { 
     include /home/user/powerangerApp/rewrites.map; 
} 

if ($new) { 
     rewrite^$new redirect; 
} 

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /home/user/powerangerApp; 
    index index.php; 

    server_name _; 

    location/{ 
     try_files $uri $uri/ =404; 
    } 

    location ~ \.php$ { 
     include snippets/fastcgi-php.conf; 
     fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
    } 
} 

然后,当我尝试重新加载nginx的我得到以下错误:

nginx: [emerg] unexpected "{" in /home/user/powerangerApp/rewrites.map:1

所以我的猜测是,nginx的不能映射PCRE正则表达式。那么我怎样才能让nginx做到这一点?

编辑1:

可以看出在https://serverfault.com/questions/482372/nginx-httpmapmodule-regex-variables#482391

我试图改变正则表达式:

?P^power_ranger/(\d{4,9})$ /power_ranger.php?ranger=$2 

而且还得到了同样的错误。

编辑2

到目前为止,我想通了,我需要一个if条件,我的nginx的配置:

if ($url ~* "^power_ranger/(\d{4,9})$"){ 
    rewrite^/power_ranger.php?ranger=$2 
} 

但我得到一个错误:

unknown directive ranger=$2 in /etc/nginx/nginx.conf:^some_number^

你研究员knwo如何解决这个问题?

回答

0

正则表达式应该改为:

~\/power_ranger\/(\d{4,9})$ /power_ranger.php?ranger=$1; 

正如你可以看到有是语法错误。

另外,nginx.conf应该是:

map $uri $new { 
     include /home/user/powerangerApp/rewrites.map; 
} 

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /home/user/powerangerApp; 
    index index.php; 

    server_name _; 

    location/{ 
     # On way too many rewrite rules you may avoit the line above 
     try_files $uri $uri/ =404; 

     if ($new) { 
      rewrite^$new redirect redirect; 
     } 
    } 

    location ~ \.php$ { 
     include snippets/fastcgi-php.conf; 
     fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
    } 
} 

请记住,在重写重定向可能被证明是为了把工作做好救星。