Заголовки 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-Control
(с public
) в одну только две строки?
Ответы
Ответ 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 отправляет заголовок до истечения срока действия директивы, чтобы успеть изменить его.