gpt4 book ai didi

Nginx - 将所有 404 错误传递回 PHP-FPM 以进行自定义错误页面处理

转载 作者:可可西里 更新时间:2023-10-31 23:07:25 27 4
gpt4 key购买 nike

我知道这个问题已经被问过一千次了,但是我找到的所有答案都不起作用(对我来说或者通常是这些问题的原始 OP)...所以,我会尝试解释尽我所能解决这个问题,希望我们能让它对我和之前问过的其他人有用。

我的 Nginx 配置(删除了许多其他不相关的东西)如下:

http {
# Config from here removed

server {
listen 80;
listen 443 ssl;
server_name mydomain.co.uk;

ssl_certificate /xxxxxxx.crt;
ssl_certificate_key /xxxxxxx.key;

# Custom error pages
root /var/www/viovet_frontend;
error_page 404 = /error404.php;

# Any simple .php page
location ~ \.php$ {
root /var/www/xxxxxx;
#index index.php index.html;

include /etc/nginx/fastcgi.conf;
fastcgi_pass phpfastcgiservers;
include fastcgi_params;

fastcgi_intercept_errors on;
}

# Lots more config and re-write rules here removed
}

upstream phpfastcgiservers {
server xxxxx1:9001;
server xxxxx2:9001;
server xxxxx3:9001;
fair;
}
}

我想做的就是让 Nginx 捕获所有 404 并通过 location ~\.php$ 将它们发送回 PHP-FPM 以向用户显示自定义错误页面,但我总是得到标准的 Nginx 错误页面。

以下 url 应该都显示 mydomain.co.uk/error404.php 的输出:

  • mydomain.co.uk/someNonExistantFile(不匹配任何位置 block )
  • mydomain.co.uk/someMissingFile.php(匹配 .php 文件位置 block 但文件不存在)

但它们实际上显示的是标准的 Nginx 404 页面。如果 location ~\.php$ 返回一个与 404 不同的错误代码(例如 5xx),那么我们不想介入,只返回 FastCGI 首先返回的内容和 header 。

我希望这是有道理的,并且有人可以提供帮助。提前谢谢你。

编辑:我尝试将 recursive_error_pages on; 添加到 # Custom error pages 之后的行,但这实际上会导致所有 Nginx 404 Not Found 错误变成 Nginx 500 Internal Server Error 错误。

编辑: 添加其他文件:/etc/nginx/fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

我想我可能根本不需要这两个! ;-)

最佳答案

我终于解决了大部分问题。感谢大家的提示和花时间写答案。

问题是我们的 error404.php 也返回了带有 404 Not Found header 的错误页面(使用 header('HTTP/1.0 404 Not Found');) 然后 Nginx 拦截了这个错误,因为 recursive_error_pages 关闭(默认)并且它显示了自己的 404 页面。关闭 fastcgi_intercept_errors 是解决方案。如果我们从错误文件中删除 header('HTTP/1.0 404 Not Found'); 那么我们会得到错误,但是带有 200 这显然不是什么我们想要。

然而,这并没有解决访问以 .php 结尾的丢失页面的问题(所以它与位置 block 匹配,因为我们现在正在取回标准的 PHP-FPM 响应一个 404 header 的正文 File not found.。我可以使用 Nate's answer 来解决这个问题,但我宁愿不需要在那里指定所有文件名。我会寻找另一种解决方案,并在我得到解决方案后将其发布在这里。

编辑:更完整的解决方案:

您需要拦截主 php 位置 block 中的错误(fastcgi_intercept_errorson),然后为您的错误页面设置另一个 block ,您不拦截它们。请参阅此配置示例:

    server {
listen 80;
listen 443 ssl;
server_name mydomain.co.uk;

ssl_certificate /xxxxxxx.crt;
ssl_certificate_key /xxxxxxx.key;

# Custom error pages
recursive_error_pages off;
error_page 404 = /http_errors/404.php;
# error_page 500 501 502 503 504 = /error5xx.php; # Not sure about this yet!

# Any simple .php page
location ~ \.php$ {
root /var/www/xxxxx;

include /etc/nginx/fastcgi.conf;
fastcgi_pass phpfastcgiservers;
include fastcgi_params;

fastcgi_intercept_errors on;
}

# Handling error pages
location ^~ /http_errors/ {
internal;

root /var/www/xxxxx;

include /etc/nginx/fastcgi.conf;
fastcgi_pass phpfastcgiservers;
include fastcgi_params;

fastcgi_intercept_errors off;
}
}

这意味着您的任何返回 HTTP 状态代码 404 的 PHP 页面都将忽略它们自己的内容(如果有的话),并且您的 /http_errors/404.php 文件的内容将被忽略被使用。

关于Nginx - 将所有 404 错误传递回 PHP-FPM 以进行自定义错误页面处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23106349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com