В чем разница между ${var}
и %{var}
в httpd.conf?
Как и когда можно использовать ${}
и %{}
?
http://httpd.apache.org/docs/2.4/configuring.html упоминает:
Значения переменных, определенных с помощью переменных среды Define of или shell, могут использоваться в строках файла конфигурации с помощью синтаксиса $ {VAR}.
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html упоминает:
Переменные сервера: это переменные формы% {NAME_OF_VARIABLE}
и
Расширения RewriteMap: это расширения формы $ {mapname: key | default}.
Будет ${VAR}
использоваться везде в httpd.conf, кроме директивы mod_rewrite (например, RewriteCond, RewriteRule, но за исключением расширений RewriteMap, которые используют ${}
как в RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )
Будет ли переменная установлена в httpd.conf с использованием SetEnvIf
Директива для использования в том же httpd.conf должна использоваться как ${var}
кроме случаев, когда переменная используется с директивой mod_rewrite, где переменная будет использоваться как %{var}
?
В чем разница между $ {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 никоим образом не распространяется на другие части конфигурации; все по-другому. Главный вывод из всего этого заключается в том, что не существует управляющего `` правила '', чтобы все это имело смысл - $
в одном месте означает нечто совершенно отличное от $
в другом месте.
Несколько удобных ориентиров:
Define
и ${VAR}
заменить один раз при запуске Apache. Это в основном полезно, когда вы хотите сделать что-то вроде обмена файлами конфигурации между средой разработки и производственной средой, но это не следует путать с использованием $
из RewriteMap
, который всегда содержит :
.%{VAR}
, вы можете получить "нормальные" переменные среды с помощью %{ENV:VAR}
, и вы можете установить переменные среды с помощью [E=VAR]
.Я просмотрел исходный код mod_rewrite и обнаружил, что примечания в комментариях (функция do_expand):
/* variable lookup */
else if (*p == '%') {
...
/* map lookup */
else { /* *p == '$' */
так что похоже, что% для точных переменных, а $ для поиска в хеш-таблицах ("картах"). Кроме того, все расширения mod_rewrite полностью независимы от ядра - все расширение выполняется в модуле отдельно.
Раньше думали, но это было неправильно:
$ {} vars используют среду проекта и оцениваются во время синтаксического анализа конфигурации.
% {} vars используют среду запроса и оцениваются во время анализа запроса. mod_rewrite использует символ% {} для предотвращения интерполяции времени конфигурации, выполняемой ядром httpd.