.htaccess - ErrorDocument 与 RewriteRule

Posted

技术标签:

【中文标题】.htaccess - ErrorDocument 与 RewriteRule【英文标题】:.htaccess - ErrorDocument vs RewriteRule 【发布时间】:2013-03-25 09:57:03 【问题描述】:

我希望将丢失文件和无效目录的请求重定向到自定义 404 错误页面。我相信这可以使用两种方法来完成。

# redirect invalid requests and missing files to the not-found page  
RewriteCond %REQUEST_FILENAME !-f  
RewriteCond %REQUEST_FILENAME !-d  
RewriteRule ^(.*)$ http://www.example.com/not-found.html [L]
# same idea but using error document  
ErrorDocument 404 /not-found.html

一种选择比另一种更好吗?我什么时候想使用一个与另一个?

【问题讨论】:

【参考方案1】:

重写规则不会返回正确的状态码。这意味着浏览器会看到您的自定义错误页面,但响应代码仍将是 200,并且浏览器(或与服务器通信的任何客户端)会认为特定的错误请求实际上是一个好的要求。

ErrorDocument 语句将显示自定义错误页面,但也会返回 404 响应代码,让浏览器(或任何客户端)知道在服务器上找不到它所请求的内容。

请注意,mod_rewrite 有一个 R 标志,您可以将响应代码提供给:

RewriteRule ^(.*)$ /not-found.html [L,R=404]

这将返回 404 响应代码,但不会显示/not-found.html 页面。如果您使用ErrorDocument 语句,它显示自定义错误文档:

RewriteRule ^(.*)$ - [L,R=404]
ErrorDocument 404 /not-found.html

重写规则将强制执行 404,其目标基本上被忽略,然后 ErrorDocument 确保提供自定义错误页面以及正确的 404 响应。

所以你几乎总是想要ErrorDocument。需要注意的另一件事是 mod_rewrite 在 URI 到文件映射管道中的位置与 ErrorDocument 不同。如果您依靠 mod_rewrite 来确定什么应该是 404,什么不应该,那么它可能会受到可能出现的其他模块的影响(例如 mod_proxy)。


明确地说,ErrorDocument 是在 URL 到文件映射管道以“找不到资源”(即 404)结束后使用的,然后自定义错误文档语句ErrorDoucment 404 提供自定义错误页面而不是默认页面。当您像在问题中那样使用 mod_rewrite 时,它​​会完全绕过管道到达 404 的自然方式。

【讨论】:

为我节省了很多时间! @Jon 向你致敬! 看来你对 apache 很了解。也许你可以帮助这个人 ***.com/questions/41415809/… 很遗憾,这不适用于 Apache/2.4.25 (Debian) / Debian 4.9.135-1 (2018-11-11) x86_64 GNU/Linux。而是生成 Apache 的默认错误页面。

以上是关于.htaccess - ErrorDocument 与 RewriteRule的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess - ErrorDocument 与 RewriteRule

htaccess:尝试 ErrorDocument 时出现 404 Not Found 错误

使用子目录中的 404 ErrorDocument

.htaccess 错误文档重定向

使用的.htaccess设置在同一文件夹中的404错误文件

尝试使用 ErrorDocument 处理请求时出现 500 内部服务器错误