Apache SetEnvIf 无法匹配 Request_Uri

Apache SetEnvIf 无法匹配 Request_Uri

简单条件,永不匹配并设置变量:

SetEnvIf Request_URI "^/path/to/something*" access_granted

使用 PHP 检查 URI 给出了正确的字符串,但是从未设置变量。

echo getenv('Request_URI'); --> /path/to/something
echo getenv('access_granted'); --> <<empty>>

就这么简单,但仍然总是无法匹配。

更新:有趣的是,我可以通过字符串实现 access_granted=1:

SetEnvIf Request_URI "^/path/*" access_granted

/path也是 RewriteBase - 也许它以某种方式连接,我不知道

答案1

您所面临的问题可能是由 mod_rewrite 引起的,正如解释的那样 在下面。重写规则在应用 setenv 之前应用,以便将重写的请求 uri 传递给它。尝试在重写时设置 env 变量。

答案2

的第二个参数SetEnvIf应该是正则表达式,因此它应该读作:

SetEnvIf Request_URI ^/path/to/something.* access_granted

你的第二次尝试:

 SetEnvIf Request_URI "^/path/*" access_granted

有效,因为确实有 0 个或更多“/”符号跟在后面/path

换句话说 - 您尝试在需要 regexp 的地方使用 shell glob。

答案3

我知道这是一个老话题,但是我在当前的研究中遇到了它,也许其他人也会有相关的问题......

对我来说,以下代码运行良好,重写后表达式匹配!

网址: www.example.de/lockthissite/

.htaccess 代码:

SetEnvIfNoCase Request_URI ^/lockthissite/$ SECURED=yes

AuthType Basic 
AuthName "restricted access" 
AuthUserFile /path/to/my/.htpasswd 
Require valid-user 
Satisfy any 
Order allow,deny 
Allow from all
Deny from env=SECURED

答案4

简单的解决方案。 Request_URI不是环境变量的名称,您正在设置一个名为的变量access_granted

相关内容