自定义404错误页面:避免和处理404错误的最佳实践

日期:2012 年 12 月 21 日星期五 08:15:28 GMT

自定义404错误页面:避免和处理404错误的最佳实践

内容类型: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页面。

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

46阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

38阅读

php一句话木马,一句话木马ctf

2026年10月05日

40阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

43阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

41阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

38阅读