Apache кеширование на основе куки
Я пытаюсь поместить 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
но не повезло найти решение.
1 ответ
Обычно это можно сделать, просто установив Expires = -1
но в этом случае это отключает слой кэширования. CacheIgnoreNoLastMod
кажется, игнорирует только заголовки no-cache и no-store, но не Expires. Я хотел бы попробовать использовать заголовок без кэширования, как:
Header merge Cache-Control no-cache env=CGI
с CacheIgnoreNoLastMod (см. mod_headers для более подробной информации о настройке заголовков). Страница заголовков w3 - хороший ресурс для понимания заголовков HTTP. Убедитесь, что вы понимаете заголовки управления кэшем, в частности, так как это поможет вам понять, что делает система и как заставить ее делать то, что вы хотите.
В целях отладки я бы начал с отключенного mod_cache и загружал страницы, используя Chrome/Firefox для проверки заголовков HTTP, чтобы убедиться, что вы получаете то, что хотите. Убедитесь, что вы перезагрузили страницу при перезагрузке (перезагрузка с помощью shift / ctrl, я всегда забываю какую).