nginx 重写规则将 URL 段转换为查询字符串参数

nginx 重写规则将 URL 段转换为查询字符串参数

我第一次设置 nginx 服务器,在为 nginx 获取正确的重写规则时遇到了一些麻烦。

我们使用的 Apache 规则是:

查看它是否是真实文件或目录,如果是,则提供服务,然后将所有请求发送/Director.php

DirectoryIndex Director.php

如果 URL 只有一个段,则将其传递为rt

 RewriteRule ^/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1 [L,QSA]

如果 URL 有两个段,则将其作为rt和传递action

RewriteRule ^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$ /Director.php?rt=$1&action=$2 [L,QSA]

我的 nginx 配置文件如下所示:

server {
...

location / {
   try_files $uri $uri/ /index.php;
}    

location ~ \.php$ {
      fastcgi_pass unix:/var/run/php5-fpm.sock;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include        fastcgi_params;
   }
}

如何将 URL 段放入查询字符串参数中,就像上面的 Apache 规则一样?

更新 1

尝试 Pothi 的方法:

# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html)$ {
   access_log off;
   expires 30d;
}


location / {
   try_files $uri $uri/ /Director.php;
   rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;
   rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;
}


location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

这会在每次请求时产生输出No input file specified.。我不清楚.php当任何块中的重写指示 .php 文件时,位置是否会被触发(并随后传递给 php)。

更新2

我仍然不清楚如何设置这些位置块并传递参数。

location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  ${document_root}Director.php?rt=$1{$args};
   include        fastcgi_params;
}

更新 3

看起来是缺少了 root 指令,导致出现该No input file specified.消息。现在这个问题已经解决,我得到的索引文件就像 URL/在每个请求上一样,无论 URL 段数有多少。

看起来我的位置正则表达式被忽略了。

我当前的配置是:

# This location is ignored:
location /([a-zA-Z0-9\-\_]+)/ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   set $args $query_string&rt=$1;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

location / {
   try_files $uri $uri/ /Director.php;
}

location ~ \.php$ {
   fastcgi_pass unix:/var/run/php5-fpm.sock;
   fastcgi_index  Director.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

答案1

免责声明:以下任何内容均未经过测试。请谨慎使用。如果出现任何问题,请按照以下说明打开调试http://nginx.org/en/docs/debugging_log.html

See if it's a real file or directory, if so, serve it,
then send all requests for / to Director.php

这可以通过以下方式实现...

server {
  index Directory.php;
  location / {
    try_files $uri $uri/ /Directory.php;
  }
}

index指令对于目录索引来说已经足够了。要将所有请求发送到 Director.php,则需要位置块。

If the URL has one segment, pass it as rt

您可以尝试以下操作...

rewrite "^/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1" last;

请记住重写部分周围的引号。最好使用引号,并且在某些情况下需要使用引号(@jerm 之前提供的链接中提到过)。

If the URL has two segments, pass it as rt and action

您可以尝试以下操作...

rewrite "^/([a-zA-Z0-9\-\_]+)/([a-zA-Z0-9\-\_]+)/$" "/Director.php?rt=$1&action=$2" last;

请注意,在上面的例子中,我没有对 QSA 做任何事情。您可以尝试$args在 Nginx 中使用变量将现有查询字符串传递给新查询字符串。参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

我希望这有助于找到完整的工作解决方案!

答案2

这是关于如何将正则表达式捕获为 nginx locations 中的变量的一个很好的入门知识

http://nginx.org/en/docs/http/server_names.html#regex_names

相关内容