![如何逆转这个 Nginx 重写规则?](https://linux22.com/image/581231/%E5%A6%82%E4%BD%95%E9%80%86%E8%BD%AC%E8%BF%99%E4%B8%AA%20Nginx%20%E9%87%8D%E5%86%99%E8%A7%84%E5%88%99%EF%BC%9F.png)
我在使 Nginx 重写正常工作方面遇到了麻烦。
在 Apache 上我进行了以下重写,将所有未请求 PHP 文件的请求定向到 index.php:
Options +FollowSymLinks
RewriteEngine on
RewriteRule !^(.*)\.php$ ./index.php [QSA,L]
同样的方法应该可以在 Nginx 上运行,但实际上却不行。这个重写什么都不做(每次请求都会抛出 404 页面):
rewrite !^(.*)\.php$ ./index.php last;
但是如果我删除感叹号,那么重写就会起作用,执行完全相反的操作(它将所有 *.php 文件请求重定向到 index.php 文件):
rewrite ^(.*)\.php$ ./index.php last;
为什么 Nginx 中的反向工作方式与 Apache 不同?我应该更改什么?带有感叹号的那个会抛出 404 错误或“未指定输入文件。”错误。
答案1
使用几个位置块。例如:
location ~ *.php$ { }
location / {
rewrite ^(.*)$ ./index.php last;
}
第一个应该捕获所有以 .php 结尾的文件并直接访问它们。第二个将捕获其他所有内容并重写为 ./index.php。
答案2
这是正确的解决方案:
# Make sure to set this as your actual server WWW root
root html;
# Index file
index index.php;
# Rewrite that directs everything, except PHP to index file
# Make sure you place this before your "location ~ \.php$ {" for the server configuration.
location / {
rewrite ^ ./index.php last;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
基本上,第一个指令表示所有内容都应定向到 PHP,而第二个位置块是典型的 PHP 指令。因此,一旦第一次重写发生,它将触发第二次重写(因此是 PHP)。