我为我的项目创建了一个 404 页面,但我似乎无法让它工作。当访问非 URL 时,我会看到一个带有“找不到文件”的白页。
www.example.com/wrongurl
我收到一个未找到的白页文件
www.example.com/wrongurl.php
我得到一个未找到的白页文件
www.example.com/wrongurl.html
我得到了自定义 404 页面
我已通过 Plesk 面板尝试了 .htaccess 文件以及 Apache 和 nginx 设置
我的.htaccess 文件
Options -MultiViews
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
# Append trailing slash if omitted (canonical redirect)
RewriteRule ^news$ /$0/ [R=301,L]
RewriteCond %{QUERY_STRING} (?:^|&)article_slug=([\w-]*)(?:$|&)
RewriteRule ^news\.php$ /news/%1 [R=301,L]
RewriteRule ^news/([\w-]*)$ /news.php?article_slug=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
ErrorDocument 404 /404.php
为了解决该问题,我已执行以下操作
检查我的 .htaccess 文件是否正在正确处理。我向其中添加了无效行(foo bar),并尝试访问不存在的页面。我收到了内部服务器错误而不是“找不到文件”。
我已检查我的自定义错误页面是否位于正确的位置 目录并具有正确的权限。我可以访问我的错误 直接在浏览器中输入 URL 即可查看页面 负载。
我的 Apache 配置允许自定义错误页面。
我尝试对 ErrorDocument 指令使用绝对路径。我没有使用像 ErrorDocument 404/404.php 这样的相对路径,而是尝试使用像 ErrorDocument 404/var/www/html/404.php 这样的绝对路径
对此的任何帮助将不胜感激。
最佳答案
这可能与 PHP 在服务器上的安装方式有关。任何带有 .php
扩展名的 URL 都可能被代理(使用 Nginx?你提到了 Nginx 和 Apache)到 PHP 可执行文件,完全绕过 Apache/.htaccess
。
当您请求 /wrongurl
形式的 URL 时,您的最后一个规则是在内部将其重写为 /wrongurl.php
,正是这个生成了“白页”找不到文件”响应。
您至少可以通过在重写请求之前检查目标文件是否存在来防止 /wrongurl
被重写为 /wrongurl.php
并绕过自定义 404。换句话说,更改最后一条规则:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
对此:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]
因此,当请求的 URL 未映射到文件时,不要重写请求。仅当相应的 .php
文件存在时才重写请求。
无需在正则表达式字符类中反斜杠转义文字点。该规则也不需要 NC
标志。
关于php - 自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75666551/