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

Apache HTTP 2.2: установка заголовка кеша при наличии версии строки запроса

Я нашел в Интернете пример того, как это сделать, но мне не удалось заставить это работать.

Хотите установить долгое время кеширования в будущем для запросов, имеющих строку запроса вроде? V = 123. Я включил свою конфигурацию ниже. Но это просто не сработает. Что я делаю не так?

RewriteEngine on
RewriteCond %{QUERY_STRING} ^v
RewriteRule ^.*$ - [ENV=LONGCACHE:1]
Header set Cache-Control "max-age=31536000, public" env=LONGCACHE

Я пробовал кучу разных комбинаций в регулярном выражении, проверяющем строку запроса, похоже, ничего не работает.

Оказывается, эта конфигурация должна быть в стороне от <VirtualHost>, что очень неприятно, так как я пытался загрузить с conf.d. Но, по крайней мере, если кто-то еще столкнется с этой проблемой, вам необходимо иметь это в своем VirtualHost!

Оказывается, эта конфигурация должна быть внутри <VirtualHost>, что неудобно, так как я пытался загрузить с conf.d

Не обязательно.

(Знание того, что эти директивы были в конфигурации основного сервера, за пределами существующего vHost, является важным моментом, отсутствующим в вашем вопросе.)

«Проблема» в том, что директивы mod_rewrite в конфигурации сервера не наследуются <VirtualHost> контейнер по умолчанию. В Header директива (часть mod_headers) в конфигурации сервера является обработано, но поскольку директивы mod_rewrite не запускались и не устанавливали LONGCACHE переменная окружения, заголовок не установлен.

Если вы были на Apache 2.4, вы можете использовать SetEnvIfExpr (mod_setenvif), чтобы установить переменную среды в зависимости от наличия строки запроса и избегать использования mod_rewrite.

В Apache 2.2 вам нужно будет включить наследование mod_rewrite в <VirtualHost> контейнер:

RewriteEngine On
RewriteOptions Inherit

Обратите внимание, однако, что директивы из конфигурации сервера наследуются после директивы в виртуальный хост контекст (NB: директивы в <Directory> контейнеры не применяются, поскольку они запускаются позже - в каталог контекст). Это означает, что директивы в vHost потенциально могут предотвратить выполнение директив сервера. (В Apache 2.4+ у вас больше контроля над тем, как наследовать директивы.)

ИЛИ включите эти "общие" директивы в отдельный файл конфигурации и include файл конфигурации в каждом виртуальном хосте по мере необходимости.