Переменные httpd.conf. В чем разница между $ {var} и% {var}?

7

В чем разница между ${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 с использованием SetEnvIfDirective, для использования в том же httpd.conf, ${var}за исключением случаев, когда переменная используется с директивой mod_rewrite, где переменная будет использоваться как %{var}?

Х10
источник

Ответы:

5

В чем разница между $ {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 не распространяется ни на какую другую часть конфигурации; все по другому. Главное, на что следует обратить внимание, это то, что не существует управляющего «правила», которое бы все это имело смысл - « $в одном месте» означает нечто совершенно отличное от « $в другом месте».

Несколько удобных ориентиров:

  1. Если вы хотите установить переменную статически при запуске Apache, используйте Defineи ${VAR}замените один раз при запуске Apache. Это в основном полезно, когда вы хотите сделать что-то вроде обмена файлами конфигурации между средой разработки и производственной средой, но это не следует путать с использованием $from RewriteMap, который всегда содержит a :.
  2. Если вы хотите работать с переменными в определенных запросах, то переменные среды - это то, что вам нужно, но вы не можете делать предположения о синтаксисе, который вы будете использовать для их получения при использовании с определенной директивой. Вам нужно будет проверить документацию для этой директивы.
  3. Когда речь идет о mod_rewrite, выбросьте все, что вы знали о переменных и их синтаксисе. Он имеет свой собственный набор переменных %{VAR}, вы можете получить свои «нормальные» переменные окружения с помощью %{ENV:VAR}и вы можете установить переменные окружения с помощью [E=VAR].
Шейн Мэдден
источник
Вот Это Да! спасибо за такую ​​длинную запись! Мне понадобится время, чтобы переварить это. Довольно странно, что документы Apache не документируют это в одном месте, это должно вводить в заблуждение многих новичков.
X10
Да, их документы не плохи для конкретных концепций, но такие вещи, как «большая картина», гораздо менее понятны.
Шейн Мэдден
1

Я посмотрел на исходный код mod_rewrite и обнаружил, что примечания в комментариях (функция do_expand):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

похоже,% для точных переменных, а $ для поиска в хеш-таблицах («карты»). Кроме того, все расширения mod_rewrite полностью независимы от ядра - все расширение выполняется в модуле отдельно.

Я думал раньше, но это было неправильно

$ {} vars использует среду проекта и оценивается во время синтаксического анализа.

% {} переменные используют среду запроса и оцениваются при разборе запроса. mod_rewrite использует% {} symantic для предотвращения интерполяции во время конфигурации, выполненной ядром httpd.

datacompboy
источник
Спасибо. Не могли бы вы включить ссылку на оригинальную документацию для этого и, если возможно, ссылку на учебник?
X10
Я никогда не видел этого в открытом тексте в документации. Вот как я понимаю, почему это было сделано. И это было неправильно :)
datacompboy