Как установить HTTP-заголовок только для существующих файлов, используемых в Apache Conf - PullRequest
1 голос
/ 21 октября 2011

Я обслуживаю файлы и запросы приложений с помощью Apache, запросы приложений используют RewriteRule для отправки URL-адресов, соответствующих шаблону, на мои серверы приложений.

Я бы хотел установить определенный заголовок HTTP (Cache-control) только для запросов, которые не соответствуют RewriteConds сверху. Есть ли способ сделать это без использования .htaccess файла?

Я попытался поместить директиву Header set ПОСЛЕ RewriteRule (которая использует флаг L), но заголовок все еще применяется.

1 Ответ

1 голос
/ 21 октября 2011

Вы действительно должны опубликовать свои rewriteRules.

Конечно, мы можем что-то сделать для этого.Первое, о чем я думаю, это установить переменную окружения в соответствии с rewriteRules (поэтому набор rewriteCond, инвертируя предыдущие), используйте тег [E=myvar:myvalue];и используйте последний доступный аргумент инструкции Header [env=myvar] для условной установки этого заголовка.

Затем вы сказали:

Есть ли способ сделать это без использования .htaccessfile?

Ну, файлы RewriteRules и .htaccess слабо связаны.Все, что вы установили в .htaccess, действительно лучше подходило бы для инструкции <Directory> с хорошим AllowOverride None на вашем VirtualHost, чтобы не допустить повторного запуска операций ввода-вывода из apache, пытающегося читать кучу файлов .htaccess при каждом запросе.

Во-вторых, вы сказали:

Я попытался поместить директиву Header set ПОСЛЕ RewriteRule (которая использует флаг L)

Ну,Флаг [L] запрещает применение нескольких RewriteRules в одном и том же каталоге один за другим, поэтому они не будут связаны прямо сейчас direclty.Но на самом деле после того, как ваша rewriteRule заканчивается ([L]), вывод rewriteRule затем повторно применяется к каталогу, чтобы посмотреть, следует ли применять какой-либо RewriteRule (возможно, тот же самый).

Вот почему мыиногда видят слишком много сообщений о внутренних перенаправлениях.

Единственный способ увидеть это - использовать RewriteLog /a/file.log и RewriteLogLevel 9 на VirtualHost (иногда много сюрпризов, некоторые правила иногда работают с большим количествомслишком много рекурсий).

Хороший RewriteCond, известный тем, что это:

RewriteCond %{ENV:REDIRECT_STATUS} ^$

Любое правило с префиксом этого rewriteCond будет применено только при первом входе в каталог, после окончанияваши правила (возможно, с [L] или из-за того, что правил больше нет), результат будет повторно протестирован по правилам direcory, но с переменной env REDIRECT_STATUS, не пустой.Это условие говорит mod-rewrite, чтобы избежать правила, если эта переменная env установлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...