【问题标题】:Custom 404 error handler in htaccess not working for non-existent ".php" fileshtaccess 中的自定义 404 错误处理程序不适用于不存在的“.php”文件
【发布时间】:2021-11-20 12:09:04
【问题描述】:

我正在使用自定义错误处理系统。

例如.htaccess文件命令:

ErrorDocument 404 /error-deal.php?code=404

error-deal.php 文件存在,如果我直接输入 URL,它会处理 $_GET 变量。

带有文件扩展名的页面不会触发.htaccess 重定向到错误页面:

https://example.com/does-not-exist.php

但没有扩展名的 URL 可以...

https://example.com/does-not-exist

我在这里错过了什么?

其他重写规则有:

#force https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NC]

#redirect all www to non www
RewriteCond %{HTTP_HOST} ^www.donbur.co.uk$
RewriteRule (.*) https://donbur.co.uk/$1 [R=301,L]

#URL re-writes for dynamic pages
    
#to handle all news requests
RewriteRule ^news/([^/]*)$ /gb-en/news/article.php?title=$1 [L]

#to handle all feature requests
RewriteRule ^features/([^/]*)$ /gb-en/features/feature.php?title=$1 [L]

【问题讨论】:

  • 您的 Apache 配置或 htaccess 中是否有任何重写规则?如果是这样,请也显示出来。
  • @MagnusEriksson 谢谢 - 我已经添加了我能找到的唯一条件和规则。
  • "带有文件扩展名的页面" - 具体来说,它似乎只有 .php 扩展名。这可能与您系统上安装 PHP 的方式有关。例如,如果所有*.php 请求都代理到备用服务器/进程,那么这将绕过应用服务器上的.htaccess 文件。
  • 谢谢@MrWhite。遗憾的是,我们无法控制此共享服务器,也无权访问配置文件。

标签: php .htaccess error-handling


【解决方案1】:

带有文件扩展名的页面不会触发 htaccess 重定向到错误页面:

正如 cmets 中所述,这似乎只影响具有 .php 扩展名的 URL。这可能是由于 PHP 在您的服务器上实现的方式所致。例如,如果所有*.php 请求都被代理到另一个后端进程,那么这将绕过您在应用服务器上的.htaccess 文件。

很遗憾,由于这似乎是一个共享服务器,您可能无法对此进行任何控制。

但是,您可以尝试一些方法。尽管您似乎在整个站点中使用以 .php 结尾的 URL,这阻碍了这一点。

尝试重置默认错误文档在设置您的自定义错误文档之前ErrorDocument 应该覆盖以前的设置,但是,有时在服务器配置中定义时,它不会。例如:

ErrorDocument 404 default
ErrorDocument 404 /error-deal.php?code=404

如果不是因为您在您的网站上使用了 .php 网址(尽管令人困惑的是,您似乎在整个网站上混合使用了 .php 和无扩展名网址?)那么您可能会强制所有.php 使用 mod_rewrite 向 404 请求(尽管这仍然可能不会覆盖默认错误响应)。

您可以在您的规范重定向(HTTP 到 HTTPS 和 www 到非 www)之后尝试以下

# Force a 404 for ".php" requests that don't exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ - [R=404]

如果您没有任何 .php URL,那么您可以删除前面的 RewriteCond 指令。


除此之外:您应该确保/error-deal.php 文档本身不可直接访问。这当前返回 200 OK 状态以表示非错误,并且似乎没有任何东西(机器人元标记、响应标头、robots.txt)阻止搜索引擎抓取/索引此页面。

【讨论】:

  • ErrorDocument 404 默认值无效;但是,对不存在的 php 请求强制执行 404 可以解决问题。谢谢。
  • 我正在使用混合扩展,因为有些站点是静态的 (.php),有些是自定义 CMS 上的动态。我正在使用 RewriteRule 将任何丑陋的 .php?title=messy 更改为 /messy 。是否首选 php 扩展(即 /messy.php)?
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
相关资源
最近更新 更多