我正从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。在某个地方,我发现我应该取代“休息”;与“最后”;像:
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一样。有什么猜测吗?
答案 0 :(得分:2)
我在位置段之外使用了上述规则并且它有效!我尝试在不同的浏览器中查看我的页面,并且ecerything很好。我总是忘记删除缓存..