.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