#caching #header #apache
#кэширование #заголовок #apache
Вопрос:
Я обслуживаю файлы и запросы приложений с помощью Apache, запросы приложений используются RewriteRule
для отправки URL-адресов, соответствующих шаблону, на мои серверы приложений.
Я хотел бы установить определенный HTTP-заголовок (Cache-control) только для запросов, которые не соответствуют RewriteConds
from above. Есть ли какой-либо способ сделать это без использования .htaccess
файла?
Я попытался поместить Header set
директиву ПОСЛЕ RewriteRule
(которая использует флаг L), но заголовок все равно применяется.
Ответ №1:
Вы действительно должны опубликовать свои RewriteRules.
Для этого, безусловно, есть что-то, что мы можем сделать. Первое, о чем я думаю, это установить переменную среды в соответствующих RewriteRules (таким образом, набор RewriteCond, инвертирующий предыдущие), используйте [E=myvar:myvalue]
тег; и используйте последний доступный аргумент инструкции заголовка [env=myvar]
, чтобы условно установить этот заголовок.
Затем вы сказали:
Есть ли какой-либо способ сделать это без использования файла .htaccess?
Ну, файлы RewriteRules и .htaccess слабо связаны. Все, что вы задаете в .htaccess, действительно лучше подходит для <Directory>
инструкции с nice AllowOverride None
на вашем виртуальном хосте, чтобы предотвратить множество операций ввода-вывода от apache, пытающихся прочитать кучу файлов .htaccess при каждом запросе.
Во-вторых, вы сказали:
Я попытался поместить директиву Header set ПОСЛЕ RewriteRule (которая использует флаг L)
Ну [L]
, флаг запрещает применять несколько RewriteRules в одном каталоге один за другим, поэтому они не будут связаны прямо сейчас напрямую. Но на самом деле после завершения вашего RewriteRule ([L]) вывод RewriteRule затем повторно применяется к каталогу, чтобы увидеть, следует ли применять какой-либо RewriteRule (возможно, тот же самый).).
Вот почему мы иногда видим слишком много сообщений о внутренних перенаправлениях.
Единственный способ увидеть, как это происходит, — использовать RewriteLog /a/file.log
and RewriteLogLevel 9
на VirtualHost (иногда много сюрпризов, некоторые правила иногда работают со слишком большим количеством рекурсий).
Хорошая перезапись, известная для этого :
RewriteCond %{ENV:REDIRECT_STATUS} ^$
Любое правило с префиксом this RewriteCond будет применяться только при первом входе в каталог, после окончания ваших правил (возможно, с помощью [L] или потому, что больше нет правила) результат будет повторно протестирован в правилах каталога, но с переменной env REDIRECT_STATUS не пустой. Это условие указывает mod-rewrite избегать правила, если установлена эта переменная env.