Назад | Перейти на главную страницу

Кеширование Apache на основе cookie

Я пытаюсь поставить mod_cache перед моим сервером приложений для кеширования «общедоступных» запросов, но не запросов от вошедших в систему пользователей. По разным причинам использование альтернативных поддоменов или путей для меня нецелесообразно. У меня есть основы, настроенные как:

# Expiry and cache-control
SetEnvIf Cookie "NOCACHE" no-cache
Header set Cache-Control "no-cache" env=no-cache
RequestHeader set X-FW-NoCache "on" env=no-cache
ExpiresActive On
ExpiresDefault "access plus 1 days"
#ExpiresByType text/html "now"
CacheEnable disk /
CacheRoot /var/cache/apache
CacheIgnoreHeaders Set-Cookie
#CacheIgnoreCacheControl on
#CacheIgnoreNoLastMod on
RewriteEngine On

# Search Engine Safe URL rewrite
# Redirect Coldfusion requests to index.cfm
# matches /file.mp4 but not /file:name.mp4 (ie; is a real file)
RewriteCond %{REQUEST_FILENAME} !/[^/:]+\.[^/:]{2,5}$
RewriteRule (.*) /index.cfm$1 [PT,L]

Поэтому, если Apache видит файл cookie NOCACHE, он всегда будет передавать запрос на сервер приложений, даже если он находится в кеше. В основном это работает, но есть одна проблема, которая меня огорчает.

Если вы посетите страницу без файла cookie, вы получите кешированную версию с будущей датой истечения срока действия. Если вы затем установите cookie и вернетесь на эту страницу, запрос не будет отправлен, поскольку у браузера есть собственная кэшированная копия с будущей датой истечения срока действия.

Как мне изменить это, чтобы браузер всегда делал запрос, а кеш отправлял 304 или кэшированную копию БЕЗ запроса сервера приложений на повторную обработку? Другими словами, как мне сказать mem_cache кэшировать файл, но не клиентские и последующие прокси?

Я пробовал использовать ExpiresByType text/html "now" но тогда кеш не кэширует его вообще - даже если CacheIgnoreCacheControl горит.

Я также играл с CacheIgnoreNoLastMod но найти решение не удалось.

Обычно вы делаете это, просто устанавливая Expires = -1 но в этом случае это отключает уровень кеширования. В CacheIgnoreNoLastMod появляется игнорировать только заголовки без кеширования и без сохранения, а не Expires. Я бы попробовал использовать заголовок без кеша, например:

Header merge Cache-Control no-cache env=CGI

с CacheIgnoreNoLastMod (см. mod_headers подробнее о настройке заголовков). В Заголовки w3 page - хороший ресурс для понимания заголовков HTTP. Убедитесь, что вы понимаете, в частности, заголовки элементов управления кешем, поскольку это поможет вам понять, что делает система и как заставить ее делать то, что вы хотите.

В целях отладки я бы начал с отключенного mod_cache и загружал страницы с помощью Chrome / Firefox, чтобы проверить заголовки HTTP, чтобы убедиться, что вы получаете то, что хотите. Обязательно принудительно перезагружайте страницу при перезагрузке (shift / ctrl reload, я всегда забываю, какой именно).