Заголовки Cache-Control повторены;действительный или нет?(Nginx) - PullRequest
24 голосов
/ 21 января 2011

У меня в Nginx есть ресурс, настроенный так:

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

Если я открою это с помощью Firebug и посмотрю на заголовки, это показывает:

Cache-Control   max-age=86400, public

Сайт использует HTTPS, поэтому я хочу убедиться, что я правильно понял, потому что браузеры не кэшируют его, если его максимальный возраст> 0 И 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 не возражает.Но так ли это?

Возможно, есть лучший способ установить Expires и Cache-Controlpublic) в одну всего две строки?

Ответы [ 2 ]

30 голосов
/ 09 марта 2011

Да, допустимо и эквивалентно использовать несколько заголовков Cache-Control.

Из спецификации HTTP 1.1 :

Несколько полей заголовка сообщения с одно и то же имя поля МОЖЕТ присутствовать в сообщение, если и только если весь значение поля для этого поля заголовка определяется как список через запятую [то есть, # (значения)]. Это ДОЛЖНО быть возможным объединить несколько полей заголовка в одно "имя-поля: значение-поля" пара, не меняя семантику сообщения, добавляя каждый последующее значение поля до первого, каждый разделен запятой.

Легко убедиться, что это положение применяется к заголовку Cache-Control, поскольку определено :

Cache-Control = "Cache-Control" ":" 1 # директива кэширования

Чтобы понять, как интерпретировать строку выше, см. Спецификации обозначений . 1# означает «разделенный запятыми список из одного или нескольких».

6 голосов
/ 20 июня 2011

У меня была такая же проблема на разных конфигурациях.Для меня сработало изменение порядка двух строк, которые устанавливают заголовки и устанавливают заголовок сразу после открывающей скобки «сервера».Возможно, это установит заголовки для всех объектов, но, возможно, будет работать и в вашем операторе «если»:


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

   server_name example.com
   ...
}


Кажется, что add_header отправляет заголовок до того, как директива expires успеет его изменить.

...