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

时间:2011-01-21 18:25:56

标签: nginx cache-control

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

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

如果我用Firebug打开它并查看它显示的标题:

Cache-Control   max-age=86400, public

该网站正在使用HTTPS,所以我想确保我做对了,因为显然浏览器不会缓存它,除非它的max-age> 0和publicSee this

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

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

重复Cache-Control标题!萤火虫显然不介意。但这是对的吗?

是否有更好的方法可以在一两行中设置ExpiresCache-Controlpublic}?

2 个答案:

答案 0 :(得分:30)

是的,它有效且相当于使用多个Cache-Control标头。

来自HTTP 1.1 spec

  

多个消息标题字段   可能存在相同的字段名称   当且仅当整个   该标题字段的字段值是   定义为以逗号分隔的列表   [即#(值)]。它必须是可能的   组合多个标题字段   成为一个“字段名称:字段值”   对,不改变语义   通过附加每个消息   后续的字段值到第一个,   每个用逗号分隔。

由于how it's defined,很容易验证此规定是否适用于Cache-Control标头:

  

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

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

答案 1 :(得分:6)

我在不同的配置上遇到了同样的问题。对我有用的是在“服务器”打开括号之后更改设置标题和放置标题设置的两行的顺序。这会将标题设置为所有对象,但也许可以在你的“if”语句中使用:


server {
   expires     31d;
   add_header  Cache-Control public;

   server_name example.com
   ...
}


似乎add_header在expires指令之前发送标头以便有时间更改它。