.htaccess 将访问基本身份验证限制为除一个文件+查询字符串之外的所有文件

30byixjq  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(123)

我需要阻止访问目录中的所有文件,只有一个特定的文件,使用特定的查询字符串。到目前为止我一直在尝试这个,但是I REQUEST_URI没有QUERY字符串

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或任何东西.php?myquery

ev7lccsx

ev7lccsx1#

SetEnvIf无法访问Apache 2.2中的查询字符串。在Python 2.4中,您可以在第二个SetEnvIf中访问查询字符串,或者只使用
下面是mod_rewrite中的一个简单示例,它在2.2 vhost上下文中工作:

RewriteEngine ON
RewriteCond %{REQUEST_URI} =/index.php
RewriteCond %{QUERY_STRING} =myquery
RewriteRule .* - [E=noauth:1]

字符串
注意:在htaccess/per-dir上下文中不起作用

kx1ctssn

kx1ctssn2#

不要认为你可以在这里做你想做的事情,因为你不能使用mod_rewrite来改变请求(auth模块发生在rewrite模块之前),你不能匹配请求URI中的查询字符串。您可能需要使用一些重定向技巧,例如:
1.创建一个名为index2.phpindex.php的符号链接(以便它们是同一个文件)
1.使SetEnvIf调用简单地匹配^/index.php
1.* 在 * index.php脚本中(可能在最上面),让它查找是否有myquery查询字符串,如果没有,则将请求重定向到/index2.php
1.当浏览器被告知转到/index2.php时,它会被要求进行身份验证
1.如果浏览器输入正确的auth,index.php将被执行(因为步骤#1)。

5w9g7ksd

5w9g7ksd3#

如果您使用的是Apache 2.4,则不再需要SetEnvIf和mod_rewrite解决方法,因为Require指令能够直接解释expressions
Apache 2.4将不按分组的Require指令视为在中,其行为类似于“or”语句。
允许访问/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>

相关问题