В чем разница между $ {var} и% {var} в httpd.conf?
Почти все. Нет строгого правила, которое бы гласило « $
делает х, %
делает у», потому что они делают разные вещи в зависимости от того, где и как они используются.
Будет ли $ {VAR} использоваться везде в httpd.conf, кроме директивы mod_rewrite
Нет - ${VAR}
применяется в качестве замены во всех местах конфигурации, даже в строке, связанной с mod_rewrite. Они могут быть определены только при запуске, используя -D
опцию, переданную в двоичный файл httpd, или Define
директиву.
Это может быть сделано, потому что эти переменные не должны содержать :
символ, тогда как RewriteMap
использование должно содержать :
символ. Это позволяет $
использовать его очень разными способами без конфликта - парсер видит :
и знает, что он не должен его заменять.
Будет ли переменная, установленная в httpd.conf с использованием директивы SetEnvIf, для использования в том же httpd.conf, использоваться как $ {var}, кроме случаев, когда переменная используется с директивой mod_rewrite, где переменная будет использоваться как% {var}?
Нет. Переменные среды - это не то же самое, что переменные, заданные с помощью -D
или Define
- это совершенно отдельный контекст для каждого запроса (это тот, с которым вы устанавливаете SetEnvIf
), который будут использовать только определенные директивы. Они специально упоминаются в тех случаях, когда они поддерживаются - в mod_rewrite они есть %{ENV:variable}
, в журналах они есть %{variable}e
, и во многих директивах есть логическая проверка, которая выглядит следующим образом env=variable
.
Итак, в основном; это запутанный беспорядок - свидетельство истории веб-сервера за последние пару десятилетий. Вероятно, главное, что вас смущает, это то, что синтаксис mod_rewrite не распространяется ни на какую другую часть конфигурации; все по другому. Главное, на что следует обратить внимание, это то, что не существует управляющего «правила», которое бы все это имело смысл - « $
в одном месте» означает нечто совершенно отличное от « $
в другом месте».
Несколько удобных ориентиров:
- Если вы хотите установить переменную статически при запуске Apache, используйте
Define
и ${VAR}
замените один раз при запуске Apache. Это в основном полезно, когда вы хотите сделать что-то вроде обмена файлами конфигурации между средой разработки и производственной средой, но это не следует путать с использованием $
from RewriteMap
, который всегда содержит a :
.
- Если вы хотите работать с переменными в определенных запросах, то переменные среды - это то, что вам нужно, но вы не можете делать предположения о синтаксисе, который вы будете использовать для их получения при использовании с определенной директивой. Вам нужно будет проверить документацию для этой директивы.
- Когда речь идет о mod_rewrite, выбросьте все, что вы знали о переменных и их синтаксисе. Он имеет свой собственный набор переменных
%{VAR}
, вы можете получить свои «нормальные» переменные окружения с помощью %{ENV:VAR}
и вы можете установить переменные окружения с помощью [E=VAR]
.
Я посмотрел на исходный код mod_rewrite и обнаружил, что примечания в комментариях (функция do_expand):
похоже,% для точных переменных, а $ для поиска в хеш-таблицах («карты»). Кроме того, все расширения mod_rewrite полностью независимы от ядра - все расширение выполняется в модуле отдельно.
Я думал раньше, но это было неправильно
источник