【发布时间】:2014-02-18 19:27:18
【问题描述】:
我正在从 Apache 迁移到 Nginx。我在将 Apache 重写规则转换为 nginx 规则时遇到了问题。我要转换的内容:
RewriteRule ^$ www/controller.php?_url_=index [QSA,L]
RewriteRule ^/+$ www/controller.php?_url_=index [QSA,L]
RewriteRule ^([a-zA-Z0-9_]+)(/([a-zA-Z0-9_/]*))?$ www/controller.php?_url_=$1&_req_=$2 [QSA,L]
RewriteRule ^([a-zA-Z0-9/]+)controller.php?(.*)$ www/controller.php?$2 [QSA,L]
我尝试使用什么:
rewrite ^/$ /www/controller.php?_url_=index break;
rewrite ^/+$ /www/controller.php?_url_=index break;
rewrite ^/([a-zA-Z0-9_]+)(/([a-zA-Z0-9_]*))?$ /www/controller.php?_url_=$1&_req_=$2 break;
rewrite ^/([a-zA-Z0-9/]+)controller.php?(.*)$ /www/controller.php?$2 break;
如果我使用上述规则,我的浏览器正在下载 php 文件(服务器没有执行它)——我猜它没有被传递给 PHP-FPM。在某个地方我发现我应该替换“break;”用“最后;”喜欢:
rewrite ^/$ /www/controller.php?_url_=index last;
替换后,我仍然从http://example.org 下载php 文件,但是当我访问http://example.org/login 时,我进入了无限循环。我阅读了 nginx 文档和不同的示例(也在 StackOverflow 上),但仍然找不到正确的配置。有人能指出我正确的方向吗?
这是我的整个配置文件:
server {
listen 80;
server_name 10.10.100.172;
error_log /var/log/nginx/example.com.error.log debug;
rewrite_log on;
location / {
root /var/www/webs;
index index.php index.html index.htm;
rewrite ^/$ /www/controller.php?_url_=index last;
rewrite ^/+$ /www/controller.php?_url_=index last;
rewrite ^/([a-zA-Z0-9_]+)(/([a-zA-Z0-9_]*))?$ /www/controller.php?_url_=$1&_req_=$2 last;
rewrite ^/([a-zA-Z0-9/]+)controller.php?(.*)$ /www/controller.php?$2 last;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /var/www/webs;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
编辑:
我将规则移到位置段之外并使用了“break;”在每条规则的末尾。当我转到 example.org/login/ 时,我可以到达 /www/controller.php?url=login&req=/ - controller.php 负责无限循环。当我尝试访问 example.org 或 example.org/ 时,我正在下载 controller.php 文件 - 就像它没有被传递给 PHP-FPM。有什么猜测吗?
【问题讨论】: