我需要使用 htpasswd 保护某些位置,并且可以正常工作:
<Location /myloc>
AuthType Basic
AuthName "My Protected Area"
AuthUserFile .htpasswd
Require valid-user
</Location>
但我需要以某种方式绕过该 Auth,例如针对 url /myloc/loc1,但不需要绕过 /myloc/loc2。这样做的原因是我希望能够获取例如 loc1 并进行一些数据库搜索。例如:
"select Status From table where url=/myloc/requested_loc" (loc1 or loc2 or any name)
if Status == 1
return 1
else
return 0
因此场景如下:
- 在浏览器提示输入用户名和密码之前执行一些脚本
- 如果脚本返回 0 则提示输入用户/密码 如果脚本返回 1 则不提示输入用户/密码并打开位置
一些想法:1.我正在考虑修改https://github.com/winlibs/apache/blob/master/2.4.x/modules/aaa/mod_auth_basic.c 但我不确定这是不是一个好主意(我确信这是一个糟糕的主意)。
- 有一些 ScriptAlias /myloc /opt/script.py 会检查我在数据库中需要什么,然后如果 1 打开位置,如果 2 发送到浏览器 401 身份验证要求。
我的想法到此结束。
我并不是在寻找解决方案,只是在寻找一些关于如何追求这一目标的想法。
解决方案和更新
我太蠢了,根本不会在 /myloc 上进行身份验证。我会在动态创建的文件 loc1.conf、loc2.conf 等上进行身份验证,然后将其包含在 apache 虚拟主机配置中。
<VirtualHost *:80>
domain
......
Include /path/loc1.conf
Include /path/loc2.conf
....
</VirtualHost>
@HBruijn给了我这个想法。
答案1
你需要调查 Apache合并指令并设置优先级。
<Location>
部分按照它们在配置文件中出现的顺序进行处理,因此类似下面的内容应该允许未经授权/未经身份验证的访问者访问 /myloc/loc1/:
<VirtualHost *:80>
ServerName example.org
DocumentRoot /var/www/
<Location /myloc/loc1/>
Order allow,deny
Allow from all
</Location>
<Location /myloc/>
AuthType Basic
AuthName "My Protected Area"
AuthUserFile .htpasswd
Require valid-user
</Location>
</VirtalHost>
从 Apache 2.3 开始,您可以使用授权容器来表达更复杂的授权逻辑。