当我访问一个不存在的带有 .php 扩展名的 URL 时,我得到了一个 ngnix 404 错误页面,但是没有 .php 扩展名的 URL 可以使用 try_files 按预期工作。其中 404 通过 php 应用程序处理。
自从我添加此代码以来就发生了这种情况建议
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
添加此内容的原因是为了修复日志中的错误:FastCGI 在 stderr 中发送:“读取上游响应标头时,主脚本未知”当我访问不存在的 .php 文件时发生此错误。我读了很多关于问题与“SCRIPT_FILENAME”缺失有关的帖子,但对我来说情况并非如此。
例子.conf
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com;
root /var/www/example/public/public;
access_log /var/log/nginx/example.access.log main_ext;
error_log /var/log/nginx/example.error.log warn;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/nginx/include.d/ssl.conf;
# Laravel
rewrite ^/index.php/(.*) /$1 permanent;
location = / {
try_files /page-cache/pc__index__pc.html /index.php?$query_string;
}
location / {
try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
}
location ~ [^/]\.php(/|$) {
include /etc/nginx/include.d/php.conf;
fastcgi_pass unix:/var/run/php/php8.0-fpm-example.sock;
}
}
php.conf
# Check file exists
try_files $uri =404;
# https://www.nginx.com/nginx-wiki/build/dirhtml/start/topics/examples/phpfcgi/
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_index index.php;
# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors off;
# include the fastcgi_param setting
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
示例 URL: https://example.com/foo- 运行良好,在 php 应用程序内显示漂亮的 404。 https://example.com/foo.php- 显示默认的 ngnix 404。
答案1
如果您希望将这些 URI 作为任何其他不存在的 URI 进行处理,请try_files $uri =404;
在文件try_files $uri /index.php?$query_string;
中更改为php.conf
。
如果你的 PHP 应用程序确实使用了PATH_INFO
FastCGI 变量(我对此表示怀疑),你应该使用
fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name /index.php?$query_string;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
(看这nginx trac 票证)。