重写文件扩展名后,Nginx服务器不会重定向

时间:2016-06-08 08:33:05

标签: php .htaccess mod-rewrite nginx url-rewriting

我想删除php文件扩展名。所以我搜索并尝试了这段代码。

效果很好,但是当我尝试不存在的页面时。

它只是说“找不到档案”。在我写'try_files $ uri ...;'之前它返回/404.html。

我试过try_files $ uri = 404;在.php $中,但所有页面都返回到/404.html。

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    root         /var/www/html;

    include /etc/nginx/default.d/*.conf;

    location / {
            try_files $uri $uri.html $uri/ @extensionless-php;
            index index.html index.php;
     }

    location ~ \.php$ {
            root            html;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
            include         fastcgi_params;
    }

    location @extensionless-php {
            rewrite ^(.*)$ $1.php last;
    }


    error_page 404 /404.html;
        location = /40x.html {
            root /var/www/html;
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /var/www/html;
    }


}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您正在将.php文件传递给PHP处理器而不检查是否存在。

您应该修改location ~ \.php$块,以便nginx使用404响应处理不存在的文件,而不是让PHP抱怨。

尝试类似:

location ~ \.php$ {
    try_files $uri =404;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass    127.0.0.1:9000;
}

我删除了额外的root指令,因为它只是令人困惑,因此块现在从外部块继承正确的值。我删除了fastcgi_index,在这种情况下没有使用。我已在fastcgi_param下方include订购,以避免无声地覆盖您的fastcgi_param语句。