当以下SetEnvIf
指令位于虚拟主机目录部分或.htaccess
文件中时,变量Request_URI
将被百分率解码。但是当它不在部分directory
或.htaccess
文件中时(即虚拟主机或服务器配置上下文),它不会被解码(它仍保持百分率编码)。
是什么控制/决定了这种差异?我猜这是必须遍历文件系统目录树的副产品。因为文件系统路径不是百分比编码的。
这是可配置的吗,以便Request_URI
ApacheSetEnvIf
变量也在虚拟主机和/或服务器配置上下文中被百分比解码?
SetEnvIf Request_URI "^.*access_logger/counters/(.*)\.gif$" Page_Name_File_Name=$1 log_file log_sql_db validate_cache
Apache/2.4.6 (CentOS)
2020 年 4 月 2 日 13:13:23
答案1
我的猜测是,这是必须遍历文件系统目录树的副产品。
这是一个合理的“猜测”,因为在请求映射到文件系统之前,服务器/虚拟主机上下文中的指令会被处理。
REQUEST_URI
但是, mod_rewrite 和 Apache 表达式使用的(同名但不同)服务器变量则不然。这是总是%-decoded,无论在哪个上下文中使用。这同样适用于指令匹配的 URL 路径RewriteRule
,它始终是 %-decoded,无论上下文如何。
这是可配置的吗,以便 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]