缓存控制头重复;有效与否?(Nginx)

缓存控制头重复;有效与否?(Nginx),nginx,cache-control,Nginx,Cache Control,我的Nginx中有一个配置如下的资源: location ~ foo\.js$ { add_header Cache-Control public; expires 1d; } 如果我用Firebug打开它并查看标题,它会显示以下内容: Cache-Control max-age=86400, public 该站点正在使用HTTPS,因此我想确保我正确使用它,因为很明显,除非它的最大年龄>0且公共,否则浏览器不会缓存它 但是当我使用curl-Ik时,我的Nginx会发生什

我的Nginx中有一个配置如下的资源:

location ~ foo\.js$ {
    add_header Cache-Control public;
    expires 1d;
}
如果我用Firebug打开它并查看标题,它会显示以下内容:

Cache-Control   max-age=86400, public
该站点正在使用HTTPS,因此我想确保我正确使用它,因为很明显,除非它的最大年龄>0且
公共
,否则浏览器不会缓存它

但是当我使用
curl-Ik时,我的Nginx会发生什么呢https://...
是说:

...
Expires: Sat, 22 Jan 2011 18:23:36 GMT
Cache-Control: max-age=86400
Cache-Control: public
...
它重复
缓存控制
标题!显然Firebug并不介意。但这是对的吗


是否有更好的方法将
Expires
Cache Control
(使用
public
)设置为一行两行?

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

从:

具有多个消息头字段的 中可能存在相同的字段名 当且仅当整个 该标题字段的字段值为 定义为逗号分隔的列表 [即#(值)]。这一定是可能的 组合多个标题字段的步骤 合并为一个“字段名称:字段值” pair,而不改变语义 通过将每个 第一个字段的后续字段值, 每个都用逗号分隔

很容易验证此规定是否适用于缓存控制标头,因为:

Cache Control=“Cache Control”“:“1#Cache指令


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

我在不同的配置上遇到了相同的问题。 这就是我目前的工作


因此,它基于HTTP规范是有效的,但真正的问题是流行的浏览器和代理如何处理多个缓存控制头?最新和最好的版本可能会正确地处理它,但Firefox尤其在缓存控制头设置有任何“不寻常”的地方时似乎不会缓存。有没有人能链接到一个好的测试?如果已经做了,我讨厌自己做;-)我在阅读规范时忽略了一个符号约定,即1#cache指令意味着一个或多个cache指令的逗号分隔列表。因此,要缩小范围,请参见中的“#规则”,您确定需要最大年龄和公共空间吗?根据规范(),第14.9.3节规定,“响应上的最大年龄指令意味着响应是可缓存的(即“公共”),除非还存在其他更严格的缓存指令。”这与问题的答案不完全一致,但具有高度相关性,IMO.它也不再工作了``缓存控制:max age=3600\n缓存控制:private,必须重新验证,代理重新验证,max age=3600``配置说明:``过期1h\n添加头缓存控制“私有,必须重新验证,代理重新验证,最大年龄=3600”``(很抱歉格式化)

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;
        ....
}