Переменные 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}?

Ответы:


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.


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

Я никогда не видел этого в открытом тексте в документации. Вот как я понимаю, почему это было сделано. И это было неправильно :)
datacompboy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.