Re: Вопрос про expires и add_header
Mikhail Mazursky
ash2kk на gmail.com
Пт Июл 30 10:28:01 MSD 2010
28 мая 2010 г. 11:45 пользователь Mikhail Mazursky <ash2kk at gmail.com> написал:
> 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