9

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

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

4

1 回答 1

32

重写规则不会返回正确的状态码。这意味着浏览器将看到您的自定义错误页面,但响应代码仍将是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的自然方式。

于 2013-04-03T19:41:39.137 回答