我希望丢失文件和无效目录的请求重定向到自定义404错误页面。我相信这可以用2种方法完成。
# 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
一种选择比另一种更好吗?我什么时候想要使用其中一个?
答案 0 :(得分:28)
重写规则不会返回正确的状态代码。这意味着浏览器将看到您的自定义错误页面,但响应代码仍然 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)。
要明确的是,在网址到文件的映射管道以“未找到资源”结束后,<{1}}被用于(即 404 ),然后自定义错误文档语句ErrorDocument
提供自定义错误页面而不是默认错误页面。当您在问题中使用mod_rewrite时,它完全绕过了管道到达 404 的自然方式。