我第一次设置 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 中的变量的一个很好的入门知识