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

Pet*_*son 26 nginx cache-control

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

location ~ foo\.js$ {
    add_header Cache-Control public;
    expires 1d;
}
Run Code Online (Sandbox Code Playgroud)

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

Cache-Control   max-age=86400, public
Run Code Online (Sandbox Code Playgroud)

该网站正在使用HTTPS,所以我想确保我做对了,因为显然浏览器不会缓存它,除非它的max-age> 0 AND public.看到这个

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

...
Expires: Sat, 22 Jan 2011 18:23:36 GMT
Cache-Control: max-age=86400
Cache-Control: public
...
Run Code Online (Sandbox Code Playgroud)

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

是否有一种更好的方法来设置ExpiresCache-Control(public仅)两行?

jar*_*obs 35

是的,它有效且等效于使用多个Cache-Control标头.

HTTP 1.1规范:

当且仅当该头字段的整个字段值被定义为以逗号分隔的列表[即,#(值)]时,具有相同字段名的多个消息头字段可以存在于消息中.必须可以将多个头字段组合成一个"字段名:字段 - 值"对,而不改变消息的语义,方法是将每个后续字段值附加到第一个字段值,每个字段值用逗号分隔.

由于其定义方式,很容易验证此规定是否适用于Cache-Control标头:

Cache-Control ="Cache-Control"":"1#cache-directive

要了解如何解释上面的行,请参阅规范的符号约定.的1#装置"的逗号分隔的一个或多个列表".

  • 因此,它基于HTTP规范是有效的,但真正的问题是流行的浏览器和代理如何处理多个Cache-Control标头?最新和最好的可能正确处理它,但是当你的缓存控制头设置有任何"不常见"时,Firefox特别似乎不会缓存.任何人都有一个良好的测试链接?如果它已经完成,我讨厌自己做;-) (2认同)

Ros*_*oss 6

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


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

   server_name example.com
   ...
}


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