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

Можно ли декодировать переменную Apache SetEnvIf Request_URI в контексте конфигурации виртуального хоста и / или сервера?

Когда следующие SetEnvIf директива находится в разделе каталога виртуального хоста или в .htaccess подать Request_URI переменная декодируется в процентах. Но когда его нет в directory раздел или .htaccess файл (то есть контекст конфигурации виртуального хоста или сервера) он не декодируется (он остается закодированным в процентах).

Что контролирует / определяет эту разницу? Я предполагаю, что это побочный продукт обхода дерева каталогов файловой системы. Поскольку путь файловой системы не закодирован в процентах.

Настраивается ли это так, чтобы Request_URI Apache SetEnvIf переменная также в процентах декодируется в контексте конфигурации виртуального хоста и / или сервера?

SetEnvIf Request_URI "^.*access_logger/counters/(.*)\.gif$" Page_Name_File_Name=$1 log_file log_sql_db validate_cache

Apache / 2.4.6 (CentOS)
2 апреля 2020 13:13:23

Я предполагаю, что это побочный продукт обхода дерева каталогов файловой системы.

Это разумное «предположение», поскольку директивы в контексте сервера / виртуального хоста обрабатываются до того, как запрос будет отображен в файловую систему.

Однако то же самое не относится к REQUEST_URI (то же имя, но другое) переменная сервера, используемая в выражениях mod_rewrite и Apache. Это всегда % -декодировано, независимо от того, в каком контексте оно используется. То же самое относится к URL-пути, совпадающему с RewriteRule директива, которая всегда% -декодируется, независимо от контекста.

Настраивается ли это таким образом, чтобы переменная Request_URI Apache SetEnvIf также в процентах декодировалась в контексте конфигурации виртуального хоста и / или сервера?

Не то чтобы я в курсе. Казалось бы, это «особенность» mod_setenvif. (Возможно, из-за определенных этапов обработки модуля?)

Однако вы можете использовать mod_rewrite, чтобы вместо этого установить переменную среды (или также). Например:

RewriteEngine On

RewriteRule access_logger/counters(.*)\.gif$ - [E=Page_Name_File_Name:$1]

В ^.* префикс в регулярном выражении в этом случае не нужен.

Чтобы установить все переменные среды, как в оригинале SetEnvIf директиве, вам необходимо явно установить для остальных варов значение 1. Например:

RewriteRule access_logger/counters(.*)\.gif$ - [E=Page_Name_File_Name:$1,E=log_file:1,E=log_sql_db:1,E=validate_cache:1]