自定义404错误页面:避免和处理404错误的最佳实践
日期:2012 年 12 月 21 日星期五 08:15:28 GMT

内容类型:text/html
代理连接:关闭
服务器:nginx/1.2.5
X-Powered-By: PHP/5.4.7
通过:1.1 c3300 (NetCache NetApp/6.0.7)
内容长度:16
未找到文件。
很多人不希望用户直接看到默认的404错误信息,而希望自定义404错误。
在给出解决方案之前,我们先分析一下如何避免此类404错误,然后讲一下实际发生这种情况时(例如用户输入了不存在的错误路径)该怎么办,以便可以显示自定义404错误。页。
1.错误的路径发送到php-fpm进程
出现这种错误时,十有八九是由于后端fastcgi进程接收到错误的路径(SCRIPT_FILENAME)引起的,而后端fastcgi进程接收到错误的路径的原因大多是由于配置错误。
常见的nginx.conf配置如下:
server {
listen [::]:80;
server_name example.com www.example.com;
access_log /var/www/logs/example.com.access.log;
location / {
root /var/www/example.com;
index index.html index.htm index.pl;
}
location /images {
autoindex on;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/example.com$fastcgi_script_name;
include fastcgi_params;
}
}
这个配置有很多不合理的地方。明显的问题之一是 root 指令被放置在 location / 块中。如果 root 指令定义在 location 块中,则 root 指令只能在其所在的位置生效。其他位置没有 root 指令。例如,location /images 块将不匹配任何请求。您需要在每个请求中重复配置 root 指令来解决此问题。因此,我们需要将root指令放在server块中,这样每个位置都会继承父server块定义的$document_root。如果某个位置需要定义不同的 $document_root,您可以在该位置定义单独的 root 指令。
另一个问题是fastCGI参数SCRIPT_FILENAME是硬编码的。如果修改 root 指令的值或将文件移动到另一个目录,php-fpm 将返回“未指定输入文件”错误,因为 SCRIPT_FILENAME 是硬编码在配置中的,不会随着 $document_root 的更改而更改。我们可以修改它。 SCRIPT_FILENAME 配置如下:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
所以我们不能忘记在 server 块中配置 root 指令,否则 $document_root 的值为空,只有 $fastcgi_script_name 会传递给 php-fpm,这将导致“未指定输入文件”错误。
2、请求的文件确实不存在
当nginx收到一个不存在的.php文件的请求时,nginx只会检查$uri是否以.php结尾,而不会判断该文件是否存在。 Nginx会将.php结尾的请求直接发送给php-fpm进行处理。 。如果在 php-fpm 处理期间找不到该文件,它将返回“未指定输入文件”,并带有“404 Not Found”标头。
解决方案
我们拦截nginx中不存在的文件,请求并返回自定义的404错误
使用 try_files 捕获不存在的 url 并返回错误。
location ~ .php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME ....
...................................
...................................
}
上述配置将检查 .php 文件是否存在。如果不存在,会返回404页面。