Подтвердить что ты не робот

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

У меня есть ресурс в моем 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) в одну только две строки?

4b9b3361

Ответ 1

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

Из HTTP 1.1 spec:

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

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

Cache-Control = "Cache-Control" ":" 1 # cache-директива

Чтобы понять, как интерпретировать строку выше, см. условные условные обозначения . 1# означает "список, разделенный запятыми, один или несколько".

Ответ 2

У меня была та же проблема с другой конфигурацией. То, что сработало для меня, - это изменить порядок двух строк, которые устанавливают заголовки и устанавливают параметры заголовка сразу после "скользящей" скобки сервера. Это, возможно, установит заголовки ко всем объектам, но, возможно, будет работать и в вашем выражении "if":


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

   server_name example.com
   ...
}


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