.htaccess - ErrorDocument vs RewriteRule

时间:2013-04-03 16:04:07

标签: .htaccess redirect seo http-status-code-404

我希望丢失文件和无效目录的请求重定向到自定义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

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

1 个答案:

答案 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 的自然方式。