Re: Вопрос про expires и add_header

Mikhail Mazursky ash2kk на gmail.com
Пт Май 28 09:45:12 MSD 2010


27 мая 2010 г. 19:12 пользователь Igor Sysoev <igor at sysoev.ru> написал:
> On Thu, May 27, 2010 at 12:27:09PM +0600, Mikhail Mazursky wrote:
>
>> Здравствуйте!
>>
>> Выяснил что директива expires не отрабатывает для 404, 500 и т.д.
>> Видимо работает для тех же кодов 200, 204, 301, 302 или 304, что
>> описаны в доках к add_header [1]. У меня картинкохостинг и если
>> картинки нет, то она и не появится. Я хочу заголовками говорить что
>> 404 тут на долго :) тем более у меня varnish до nginx'а. Тоже самое и
>> со статусом 50х - если fastcgi бекэнд, который делает тумбнейлы, лег,
>> то хотелось бы закешировать отдаваемую для этого картинку в varnish'е
>> ну к примеру на минуту.
>>
>> Почему бы не сделать настраиваемыми коды, для которых expires и
>> add_header срабатывают? По умолчанию сделать те, которые сейчас
>> "вшиты".
>
> В принципе, можно сделать что-то вроде
>
> expires  200 404     1h;
> add_header  200 404  ...
>
> Вопрос лишь в том, понимают ли это браузеры/прокси ?
В спецификациях HTTP в разделе про кешированиеи и т.п. я не нашел
упоминания про "валидность" заголовков только для каких-то
определенных статусов - видимо должно работать для всех.
Судя по аксес логам браузерный кеш для 404 работает в фаерфоксе и
хроме, в ИЕ8 не работает. Создал хтмл страничку с картинкой,
генерируемой бекэндом с такими заголовками:

Заголовки запроса:

GET /img/7e9108a76bedbd5e2626f9adc47d44cc.jpg HTTP/1.1
Host: host.tld
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.2.3)
Gecko/20100401 Firefox/3.6.3
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

Заголовки ответа:

HTTP/1.1 404 Not Found
Server: nginx
Date: Fri, 28 May 2010 05:06:04 GMT
Content-Type: image/jpeg
Connection: keep-alive
Content-Length: 24787
Expires: Thu, 31 Dec 2037 23:55:55 GMT

После повторного захода на страницу запроса к картинке нет вообще.

> Кстати, если у создаваемых fastcgi'ем картинок нет Last-Modifed/ETag,
> то это можно кэшировать nginx'ом без varnish'а.
У меня есть два типа тумбнейлов:
1. для обычных картинок - они хранятся в mogilefs как и исходные
картинки. Отдается Last-Modifed+Expires max;
2. для картинок с сообщениями об ошибках. Для кодов 404, 50х для
тумбнейлов выдаются специальные картинки того размера, которого должен
был быть тумбнейл. Хочу отдавать Expires 1m для 50х и max для 404.
Первые, после пережатия бекэндом, записываются в mogilefs и в
дальнейшем отдаются оттуда. А вторые используют fastcgi_cache. Все
картинки кешируются varnish'ем вне зависимости от кода ответа, время
кеширования varnish берет из заголовков ответа nginx'а. Конечно можно
было бы руками написать в конфиге varnish'а что ему надо кешировать
404 и 50х и на сколько, но я думаю в данном случае "правильнее"
отдавать такие заголовки nginx'ом. К тому же на пути запроса/ответа
могут быть другие прокси.

Если было бы можно, я бы сделал вот так
expires 200 404 max;
expires 500 502 503 504 1m;

Спасибо!


Подробная информация о списке рассылки nginx-ru