#apache #mod-expires
#apache #mod-истекает
Вопрос:
Я хочу установить заголовки кэша с помощью модуля mod_expires от apache. Моя конфигурация выглядит примерно так:
<LocationMatch ^/static >
ExpiresDefault "access plus 1 years"
</LocationMatch>
Проблема в том, что файлы генерируются третьей системой, которую я не контролирую. Эта система предоставляет файлы со следующими заголовками:
Date Mon, 24 Oct 2011 08:39:02 GMT
Cache-Control no-cache,no-store,must-revalidate
Pragma no-cache
Expires Thu, 01 Dec 1994 16:00:00 GMT
Эти заголовки делают невозможным установку заголовков кэша с помощью mod_expires. http://httpd.apache.org/docs/2.2/mod/mod_expires.html говорит нам, почему:
Когда заголовок Expires уже является частью ответа, сгенерированного сервером, например, когда он генерируется CGI-скриптом или проксируется с исходного сервера, этот модуль не изменяет и не добавляет заголовок Expires или Cache-Control.
Есть ли какой-либо возможный способ обойти это правило и перезаписать заголовки с помощью mod_expires ?
Обновление: одним из возможных решений, позволяющих избежать этого ограничения, является использование только mod_headers для установки заголовков кэша. К сожалению, это не альтернатива, потому что значения должны быть вычислены.
Заранее благодарю.
Ответ №1:
К сожалению, это известное ограничение, и нам пришлось вернуться к использованию only mod_headers
.
Ответ №2:
Предложение Regilero не сработает, потому что директивы заголовка будут обработаны очень поздно в директиве обработки ответа — после mod_expire
. Таким образом, вы бы сбросили заголовки после mod_expires
того, как сделали (или не сделали) то, что он должен был делать.
Если это apache 2.2, вы можете попробовать поместить early
в конце каждой директивы заголовка. Это подскажет ему сделать это на ранней стадии обработки ответа, а не в конце.
так что попробуйте:
<LocationMatch ^/static >
Header unset Cache-Control early
Header unset Pragma early
Header unset Expires early
ExpiresDefault "access plus 1 years"
</LocationMatch>
Не тестировал, но попробуйте…
Ответ №3:
Вы пробовали смешивать его с mod_headers?
<LocationMatch ^/static >
Header unset Cache-Control
Header unset Pragma
Header unset Expires
ExpiresDefault "access plus 1 years"
</LocationMatch>
Не проверено, но в случае…
Комментарии:
1. Мх, это не сработало. Он удаляет только заголовки. ExpiresDefault не имеет никакого эффекта.
2. шеффилд: хорошо, это половина шагов 🙂 Возможно, вы все равно могли бы использовать инструкции модуля заголовка для отправки новых заголовков, а не модуля Expires . Если вам нужна только эта настройка по умолчанию и нет ExpiresByType, это может сработать.
3. это не альтернатива для использования, потому
access
что предложение должно быть вычислено.4. @scheffield Вы когда-нибудь исправляли это?
5. Нет, это известное ограничение, и нам пришлось вернуться к использованию только mod_headers .