我正在尝试从Nginx + PHP-FPM
迁移到Apache + mod_php
。我目前正在使用mod_rewrite
将一些以.php
结尾的虚拟URI重写为实际的PHP脚本。这在使用mod_php
时非常有效。但是使用Nginx + FPM
,因为我们必须使用proxy_pass
,所以这不起作用。当我添加正则表达式位置块以匹配.php
扩展名时,它会获得最高优先级,并且不会应用我的重写规则。
我该如何解决这个问题?
location /test/ {
rewrite "^/test/([a-z]+).php$" test.php?q=$1 last;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $fastcgi_script_name_custom $fastcgi_script_name;
if (!-f $document_root$fastcgi_script_name) {
set $fastcgi_script_name_custom "/cms/index.php";
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
答案 0 :(得分:1)
您可以将rewrite
规则放在location
块的上下文中server
块之上。或者,您可以将rewrite
规则放在与{URI匹配的location
块中。
所以你可以使用这个:
rewrite "^/test/([a-z]+).php$" /test.php?q=$1 last;
location / { ... }
location ~ [^/]\.php(/|$) { ... }
或者这个:
location / { ... }
location ~ [^/]\.php(/|$) {
rewrite "^/test/([a-z]+).php$" /test.php?q=$1 break;
...
}
请注意,重写的URI需要前导/
(与Apache惯例不同)。
有关详细信息,请参阅this document。