38

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

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

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

Cache-Control   max-age=86400, public

该网站使用的是 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
...

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

是否有一种更好的方法可以在两行中设置ExpiresCache-Control(with )?public

4

2 回答 2

43

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

HTTP 1.1 规范

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

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

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

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

于 2011-03-09T00:37:21.083 回答
4

我在不同的配置上遇到了同样的问题。这是目前对我有用的。

取自模块 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;
        ....
}

于 2011-06-20T18:02:13.970 回答