Вы действительно должны опубликовать свои 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 установлена.