如何向 apache 和 nginx 服务的所有 404 页面添加无缓存标头?

Art*_*kii 10 nginx cache http-headers http-status-code-404 apache-2.2

我最近在切换到 Cloudflare 后遇到了一个问题,解决方案是基本上阻止 Cloudflare 缓存 404 响应。

在我们的负载平衡多服务器设置中,偶尔会发生 404,但它们会被 rsync(通过 lsyncd)快速修复。在 Cloudflare 之前,对 404ed 文件的重新请求将很快变为 200,因为 rsync 完成其工作。

但是,由于 Cloudflare 根据缓存标头缓存所有数据,并且 apache 和 nginx 都不会发送 404 的 no-cache 标头,因此 Cloudflare 最终会缓存 404 响应一段时间。

我一直在寻找一种解决方案,以在 apache 和 nginx(全球范围内,对于所有托管域)中为 404s 全局添加此类标头,但到目前为止还没有找到。

任何人都可以帮忙吗?

谢谢你。

jim*_*miw 6

您不能使用 error_page 指令,然后使用添加的标头单独处理位置吗?

例如在 Nginx 中:

    server {
      ...
      error_page 404 /404.html;
      location = /404.html {
        root   /usr/share/nginx/html;
        add_header Cache-Control "no-cache" always;
      }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我更新了我的答案,您或许应该添加一个答案,显示您为解决问题所做的工作? (2认同)

Xav*_*cas 5

你也可以这样做:

map $status $cache_header {
    default <for_other_codes>;
    404     "no-cache";
}


server {

    [ ... ]

    add_header "Cache-Control" $cache_header always;

}
Run Code Online (Sandbox Code Playgroud)


cay*_*eaf 5

在 apache 2.4 中,您可以尝试以下操作:

FileETag None
<IfModule mod_headers.c>
    Header always unset ETag "expr=%{REQUEST_STATUS} == 404"
    Header always set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_STATUS} == 404"
    Header always set Pragma "no-cache" "expr=%{REQUEST_STATUS} == 404"
    Header always set Expires "Wed, 11 Jan 1984 05:00:00 GMT" "expr=%{REQUEST_STATUS} == 404"
</IfModule>
Run Code Online (Sandbox Code Playgroud)

always是重要的,因为这是一个:

您正在向本地生成的非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与 always 对应的表。

您说的是所有 404,但为了完整参考,当然将其包装在 a 中<FilesMatch><LocationMatch>限制范围可能是有意义的。

我相信这是 apache 2.4 中的一项新功能,因为使用expr条件不是 mod_headers 文档的 2.2 版本。

curl -I [foo] 没有这个配置的测试:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)

curl -I [foo] 使用此配置进行测试:

HTTP/1.1 404 Not Found
Date: Thu, 24 May 2018 17:44:42 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)

资料来源:

http://httpd.apache.org/docs/current/mod/mod_headers.html