![Apache SetEnvIf Request_URI 变量可以在虚拟主机和/或服务器配置上下文中解码吗?](https://linux22.com/image/755704/Apache%20SetEnvIf%20Request_URI%20%E5%8F%98%E9%87%8F%E5%8F%AF%E4%BB%A5%E5%9C%A8%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E5%92%8C%2F%E6%88%96%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%AD%E8%A7%A3%E7%A0%81%E5%90%97%EF%BC%9F.png)
当以下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]