Назад | Перейти на главную страницу

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

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

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

  1. Если вы хотите установить переменную статически при запуске Apache, используйте Define и ${VAR} заменить один раз при запуске Apache. Это в основном полезно, когда вы хотите сделать что-то вроде обмена файлами конфигурации между средой разработки и производственной средой, но это не следует путать с использованием $ из RewriteMap, который всегда содержит :.
  2. Если вы хотите работать с переменными в определенных запросах, тогда переменные среды - это то, что вам нужно, но вы не можете делать предположения о синтаксисе, который вы будете использовать для их получения при использовании с определенной директивой. Вам нужно будет проверить документацию по этой директиве.
  3. Когда идет речь о mod_rewrite, выбросьте все, что, как вы думали, знаете о переменных и их синтаксисе. У него есть собственный набор переменных в %{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.