Apache SetEnvIf Request_URI 变量可以在虚拟主机和/或服务器配置上下文中解码吗?

Apache SetEnvIf Request_URI 变量可以在虚拟主机和/或服务器配置上下文中解码吗?

当以下SetEnvIf指令位于虚拟主机目录部分或.htaccess文件中时,变量Request_URI将被百分率解码。但是当它不在部分directory.htaccess文件中时(即虚拟主机或服务器配置上下文),它不会被解码(它仍保持百分率编码)。

是什么控制/决定了这种差异?我猜这是必须遍历文件系统目录树的副产品。因为文件系统路径不是百分比编码的。

这是可配置的吗,以便Request_URIApacheSetEnvIf变量也在虚拟主机和/或服务器配置上下文中被百分比解码?

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]

相关内容