单个 ErrorDocument 指令以捕获所有错误 (.htaccess)
Posted
技术标签:
【中文标题】单个 ErrorDocument 指令以捕获所有错误 (.htaccess)【英文标题】:Single ErrorDocument directive to catch all errors (.htaccess) 【发布时间】:2011-02-06 09:25:23 【问题描述】:是否有类似通配符指令来捕获所有可能的错误并在单个自定义错误页面中处理它们?
ErrorDocument 404 /error.php?code=404
ErrorDocument 403 /error.php?code=403
...
ErrorDocument NNN /error.php?code=NNN #possible use of RegExp?
我知道我可能不会在这里处理很多自定义错误页面,但我对此很好奇。
【问题讨论】:
【参考方案1】:感谢@gadget-guru,您启发我构建了一个脚本来测试所有错误,并构建了这个.htaccess
文件来一次捕获所有错误。
ErrorDocument 400 /
ErrorDocument 401 /
ErrorDocument 402 /
ErrorDocument 403 /
ErrorDocument 404 /
ErrorDocument 405 /
ErrorDocument 406 /
ErrorDocument 407 /
ErrorDocument 408 /
ErrorDocument 409 /
ErrorDocument 410 /
ErrorDocument 411 /
ErrorDocument 412 /
ErrorDocument 413 /
ErrorDocument 414 /
ErrorDocument 415 /
ErrorDocument 416 /
ErrorDocument 417 /
ErrorDocument 422 /
ErrorDocument 423 /
ErrorDocument 424 /
ErrorDocument 426 /
ErrorDocument 428 /
ErrorDocument 429 /
ErrorDocument 431 /
ErrorDocument 451 /
ErrorDocument 500 /
ErrorDocument 501 /
ErrorDocument 502 /
ErrorDocument 503 /
ErrorDocument 504 /
ErrorDocument 505 /
ErrorDocument 506 /
ErrorDocument 507 /
ErrorDocument 508 /
ErrorDocument 510 /
ErrorDocument 511 /
这会将用户重定向到主页,但您当然可以选择任何页面。示例:
ErrorDocument 511 /error.html
注意任何其他错误代码都会破坏服务器导致HTTP 500
【讨论】:
【参考方案2】:供完整参考...据我所知...
首先 - .htaccess 格式化
第二 - 描述。
我在这里找到的所有这些 -> httpstatuses.com
这些都是代码 - 不仅仅是错误 .. 有些会破坏您的网站。 .
像这样使用:
ErrorDocument 100 https://EXAMPLE.com
这是精确的复制粘贴。它不是我的,但是我重新格式化了列表。
(悬停查看描述,点击查看详情。)
1××:信息性
&项目符号; 100:继续 &子弹; 101:交换协议 &子弹; 102:处理中
2××:成功
&项目符号; 200:好的 &子弹; 201:已创建 &子弹; 202 :接受 &子弹; 203 : 非权威信息 &子弹; 204:好的(没有内容) &子弹; 205:重置内容 &子弹; 206:部分内容 &子弹; 207:多状态 &子弹; 208:已举报 &子弹; 226 : IM 已使用
3××:重定向
&项目符号; 300 : 多选 &子弹; 301:永久移动 &子弹; 302:找到 &子弹; 303 : 查看其他 &子弹; 304:未修改 &子弹; 305 : 使用代理 &子弹; 307 : 临时重定向 &子弹; 308:永久重定向
4××:客户端错误
&项目符号; 400 : 错误请求 &子弹; 401 : 未经授权 &子弹; 402 : 需要付款 &子弹; 403 : 禁止 &子弹; 404:未找到 &子弹; 405 : 不允许的方法 &子弹; 406:不可接受 &子弹; 407:需要代理身份验证 &子弹; 408 : 请求超时 &子弹; 409:冲突 &子弹; 410:走了 &子弹; 411:需要长度 &子弹; 412:前置条件失败 &子弹; 413:请求实体太大 &子弹; 414 : 请求 URI 太长 &子弹; 415:不支持的媒体类型 &子弹; 416:请求的范围不满足 &子弹; 417 : 期望失败 &子弹; 418 : 我是茶壶 &子弹; 422 : 无法处理的实体 &子弹; 423:锁定 &子弹; 424 : 方法失败 &子弹; 426:需要升级 &子弹; 428 :需要先决条件 &子弹; 429.") : 请求太多 &子弹; 431:请求标头字段太大 &子弹; 444:没有回应 &子弹; 451:由于法律原因不可用 &子弹; 499:客户端关闭请求
5××:服务器错误
&项目符号; 500:内部服务器错误 &子弹; 501:未实施 &子弹; 502 : 网关错误 &子弹; 503 : 服务不可用 &子弹; 504 : 网关超时 &子弹; 505:不支持 HTTP 版本 &子弹; 506:变体也在协商 &子弹; 507 : 存储空间不足 &子弹; 508:检测到环路 &子弹; 510:未扩展 &子弹; 511:需要网络身份验证 &子弹; 599:网络连接超时错误
(Source)
【讨论】:
【参考方案3】:我没有找到用一行来处理所有 ErrorDocument 的方法。但是您不必写出所有重定向。您可以通过以下方式在 PHP 中传递 ErrorCode:
$response_code = http_response_code()
我的 .htaccess 看起来像
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
【讨论】:
【参考方案4】:您可以通过 REDIRECT_STATUS 环境变量(由 Apache 设置)在脚本中获取它,而不是传递错误状态代码。见:http://httpd.apache.org/docs/2.0/custom-error.html
【讨论】:
这并不能解决枚举.htaccess
中的每个错误代码的问题,但知道仍然很有用
这就是我正在做的事情,问题是如何让这个在 .htaccess 中更容易处理。【参考方案5】:
这是不可能的。对于要处理的每个状态代码,您需要有一个 ErrorDocument
指令,而不是使用默认错误处理程序。
【讨论】:
好吧,有点想通了——我尝试使用一些可用于 RewriteRule 指令的“技巧”,但它们只给出了 500 个错误。感谢您的澄清。以上是关于单个 ErrorDocument 指令以捕获所有错误 (.htaccess)的主要内容,如果未能解决你的问题,请参考以下文章
在 php 中触发 403 以显示 ErrorDocument
尝试使用 ErrorDocument 时出现 404 Not Found 错误