Cache-Control 标头重复;是否有效?(Nginx)

44

我在Nginx中有一个资源,其配置如下:

location ~ foo\.js$ {
    add_header Cache-Control public;
    expires 1d;
}

如果我用Firebug打开并查看头部信息,它会显示如下内容:

Cache-Control   max-age=86400, public

这个网站正在使用HTTPS,因此我希望确保我做得正确,因为显然浏览器不会缓存它,除非它的max-age>0且是public请参阅此内容

但是当我使用curl -Ik https://...时,我的Nginx会发生什么情况呢?它会显示:

...
Expires: Sat, 22 Jan 2011 18:23:36 GMT
Cache-Control: max-age=86400
Cache-Control: public
...

它重复了Cache-Control头!显然Firebug不介意。但这样做对吗?

有没有更好的方法在只有两行代码的情况下同时设置ExpiresCache-Control(使用public)?


1
你确定需要 max-age 和 public 吗?根据规范 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html),第14.9.3节指出,“响应中的 max-age 指令意味着响应是可缓存的(即,“public”),除非还存在其他更严格的缓存指令。” - herbrandson
2个回答

48

是的,使用多个Cache-Control头部有效且等效。

来自HTTP 1.1规范

如果仅当整个标头字段的field-value定义为逗号分隔列表(即#(values)),则具有相同field-name的多个消息头字段可以出现在消息中。必须能够通过将每个后续field-value附加到第一个字段而由逗号分隔来将多个标头字段组合成一个“field-name:field-value”对,而不改变消息的语义。

可以轻松验证此规定适用于Cache-Control头部,原因是它是如何定义的

Cache-Control =“Cache-Control”:“1#cache-directive”

要了解如何解释上面的行,请参见规范的符号约定1#表示“一个或多个逗号分隔的列表”。


4
根据HTTP规范,这是有效的。但真正的问题是,流行的浏览器和代理如何处理多个Cache-Control头?最新的浏览器可能已经正确地处理了它,但特别是Firefox似乎只要你的缓存控制头设置有任何“不寻常”的内容,就会导致无法缓存。有人有一个好的测试链接吗?如果已经有人做过了,我就不想自己做了;-) - rmalayter
我在阅读规范时错过的符号约定是,1#cache-directive表示一个或多个缓存指令的逗号分隔列表。因此,要进行缩小,请参见符号约定中的“#rule”。 - fess .

3

我在不同的配置中遇到了相同的问题。以下是目前适用于我的解决方案。

示例取自Module ngx_http_headers_module


map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    application/octet-stream   max;
    ~image/                    max;
}

server {
        expires $expires;
        ....
}

注:以上内容涉及IT技术,建议您参考相关专业术语进行理解。

虽然不完全回答了问题,但在我看来高度相关。 - Ivan Anishchuk
还有它不再起作用了配置如下: expires 1h;\n add_header Cache-Control "private, must-revalidate, proxy-revalidate, max-age=3600"; ```(对格式不好意思) - Ivan Anishchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接