.htaccess - ErrorDocument vs RewriteRule

csi*_*csi 8 .htaccess seo redirect 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
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Lin 30

重写规则不会返回正确的状态代码.这意味着浏览器将看到您的自定义错误页面,但响应代码仍然是200,并且浏览器(或任何客户端正在与服务器通信)将认为特定的错误请求实际上是一个好的请求.

ErrorDocument语句将显示自定义错误页面,但也将返回404响应代码,让浏览器(或任何客户端)知道在服务器上找不到它所请求的内容.

请注意,mod_rewrite有一个R标志,您可以将响应代码提供给:

RewriteRule ^(.*)$ /not-found.html [L,R=404]
Run Code Online (Sandbox Code Playgroud)

这将返回404响应代码,但不会显示/not-found.html页面.如果您使用以下语句,它将显示自定义错误文档ErrorDocument:

RewriteRule ^(.*)$ - [L,R=404]
ErrorDocument 404 /not-found.html
Run Code Online (Sandbox Code Playgroud)

重写规则将强制404,其目标基本上被忽略,然后ErrorDocument确保提供自定义错误页面以及正确的404响应.

所以你想要ErrorDocument,几乎总是如此.另外需要注意的是,mod_rewrite位于URI到File映射管道的不同位置ErrorDocument.如果你依靠mod_rewrite来确定什么应该是404以及什么不应该,那么它可能会受到其他模块的影响(例如mod_proxy).


需要明确的是,在ErrorDocument使用的URL到文件映射管道最后提出了"资源找不到"(即404),然后将自定义错误文件的语句,ErrorDoucment 404而不是提供了一个自定义错误页的默认之一.当你在问题中使用mod_rewrite时,它完全绕过了管道到达404的自然方式.