如何逆转这个 Nginx 重写规则?

如何逆转这个 Nginx 重写规则?

我在使 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)。

相关内容