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