【问题标题】:.htaccess - ErrorDocument vs RewriteRule.htaccess - ErrorDocument 与 RewriteRule
【发布时间】:2023-03-28 06:39:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 为我节省了很多时间! @Jon 向你致敬!
    • 看来你对 apache 很了解。也许你可以帮助这个人 stackoverflow.com/questions/41415809/…
    • 很遗憾,这不适用于 Apache/2.4.25 (Debian) / Debian 4.9.135-1 (2018-11-11) x86_64 GNU/Linux。而是生成 Apache 的默认错误页面。
    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多