我需要阻止访问dir中的所有文件,但需要访问具有特定查询字符串的特定文件。到目前为止我一直在尝试这个,但是我要求我没有查询字符
SetEnvIf Request_URI ^index.php?myquery$ noauth=1
AuthType Basic
AuthUserFile /home/user/.htpasswd
AuthName "Pass"
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth
同样,用户应该只能访问index.php?myquery。不是index.php或anything.php?myquery
答案 0 :(得分:1)
SetEnvIf无法访问Apache 2.2中的查询字符串。在2.4中,您可以访问第二个SetEnvIf中的查询字符串,或者只使用< if>
这是mod_rewrite中的一个简单示例,虽然它适用于2.2 vhost上下文:
RewriteEngine ON
RewriteCond %{REQUEST_URI} =/index.php
RewriteCond %{QUERY_STRING} =myquery
RewriteRule .* - [E=noauth:1]
注意:不适用于htaccess / per-dir上下文
答案 1 :(得分:0)
不要认为你可以在这里做你想做的事情,因为你不能使用mod_rewrite来改变请求(auth模块在重写模块之前发生)并且你无法匹配请求URI中的查询字符串。你可能需要用一些重定向技巧做一些事情,可能是这样的事情:
index.php
的{{1}}符号链接(以便它们是同一个文件)index2.php
SetEnvIf
来电匹配
^/index.php
脚本中(可能位于最顶端),让它查找是否有index.php
查询字符串,如果没有,则重定向请求到myquery
/index2.php
时,会要求其进行身份验证/index2.php
会被执行(因为步骤1)。答案 2 :(得分:0)
如果您使用的是Apache 2.4,则不再需要SetEnvIf和mod_rewrite解决方法,因为Require指令可以直接解释expressions:
Apache 2.4将Require指令未按进行分组,就好像它们在一样,该指令的行为类似于“或”语句。
允许访问/ callbacks / foo
Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user
允许访问/ callbacks / foo?secret_var = 42:
Require expr %{QUERY_STRING} = 'secret_var=42'
Require valid-user
此示例将允许访问/ callbacks / foo?secret_var = 42,但需要/ callbacks / foo的用户名和密码:
<RequireAny>
<RequireAll>
# I'm using the alternate matching form here so I don't have
# to escape the /'s in the URL.
Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require expr %{QUERY_STRING} = 'secret_var=42'
</RequireAll>
Require valid-user
</RequireAny>