nginx 404 .php 扩展与 fpm

nginx 404 .php 扩展与 fpm

当我访问一个不存在的带有 .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_INFOFastCGI 变量(我对此表示怀疑),你应该使用

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 票证)。

相关内容