mod_cache + ETag: Apache не отвечает 304 клиенту
У меня проблема с mod_cache и ETags. Вот мой сценарий:
Среда: Firefox, Apache 2.2.22 (Mac OSX по умолчанию), любое веб-приложение, Apache является прокси для веб-приложения.
Начальное состояние:
- Браузер имеет (просроченную) версию кеша doc /aaa, ETag=123
- Apache имеет (просроченную) версию кеша doc /aaa, ETag=123
Сценарий:
- Запросы браузера / AAA, если-нет-совпадение: 123
- Apache запрашивает /aaa, If-none-Match: 123 от Web App
- Веб-приложение возвращает 304
- Apache возвращает свою кешированную версию в браузер (200)
Разве Apache не должен вернуть 304 браузеру?
Дополнительная информация:
- если у Apache нет кэшированной версии / aaa, он перенаправляет ETag в Web App, получает 304 и возвращает 304 в браузер
- работа с Last-Modified/If-Modified-Since работает вместо ETags (после получения 304 из Web-приложения Apache возвращает 304 в браузер)
Гораздо более простой сценарий:
- Версия Apache не устарела (ETag: 123) - ему не нужно получать обновление из Web App
- ПОЛУЧИТЬ / ааа, если-нет-совпадение: 123
- Ответ: 200 (вместо 304?)
Apache Conf
CacheRoot /private/var/log/apache2/cache/
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
CacheIgnoreCacheControl On
CacheIgnoreHeaders Set-Cookie
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/ retry=0
ProxyPassReverse / ajp://localhost:8009/
ProxyPreserveHost on
Заголовки запроса / ответа:
GET / HTTP/1.1
Accept: */*
If-None-Match: 123456
HTTP/1.1 200 OK
Date: Tue, 01 Oct 2013 14:01:16 GMT
ETag: 123456
Expires: Tue, 01 Oct 2013 14:30:55 GMT
Cache-Control: max-age=1800
Content-Language: en-US
Age: 21
Content-Length: 20186
Content-Type: text/html;charset=UTF-8
1 ответ
Согласно спецификации протокола заголовок If-None-Match должен быть заключен в ".
Попробуйте отправить:
If-None-Match: "123"