Как установить HTTP-заголовок только для существующих файлов, используя в Apache conf

#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.