将acess Basic Auth限制为除一个文件+查询字符串以外的所有文件

时间:2015-08-21 18:24:59

标签: apache .htaccess query-string http-basic-authentication

我需要阻止访问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

3 个答案:

答案 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中的查询字符串。你可能需要用一些重定向技巧做一些事情,可能是这样的事情:

  1. 制作名为index.php的{​​{1}}符号链接(以便它们是同一个文件)
  2. index2.php
  3. 进行SetEnvIf来电匹配
  4. ^/index.php脚本中(可能位于最顶端),让它查找是否有index.php查询字符串,如果没有,则重定向请求到myquery
  5. 当告知浏览器转到/index2.php时,会要求其进行身份验证
  6. 如果浏览器输入正确的身份验证,/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>

More examples.