php - 自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

标签 php .htaccess nginx plesk custom-error-pages

我为我的项目创建了一个 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

Apache 和 nginx 设置 enter image description here

为了解决该问题,我已执行以下操作

  1. 检查我的 .htaccess 文件是否正在正确处理。我向其中添加了无效行(foo bar),并尝试访问不存在的页面。我收到了内部服务器错误而不是“找不到文件”。

  2. 我已检查我的自定义错误页面是否位于正确的位置 目录并具有正确的权限。我可以访问我的错误 直接在浏览器中输入 URL 即可查看页面 负载。

  3. 我的 Apache 配置允许自定义错误页面。

  4. 我尝试对 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/

相关文章:

magento - Nginx Magento配置index.php循环错误

nginx proxy_pass 到一个目录

javascript - 需要来自存储在 Woocommerce 订单中的选择字段的选项文本

apache - 如何在 htaccess 中匹配 <Files> 中的查询字符串?

php - 使用 .htaccess 进行多 url 重定向

php - 如何使用 php 删除 .htaccess 中的空格

php创建目录

php - 如何从 MySql Query 提供的经纬度获取半径内的所有结果

php - 如何通过此文件上传传递 csrf token

reactjs - React.js 应用程序显示 404 未在 nginx 服务器中找到