如何在 Apache 基本身份验证之前执行脚本?

如何在 Apache 基本身份验证之前执行脚本?

我需要使用 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

因此场景如下:

  1. 在浏览器提示输入用户名和密码之前执行一些脚本
  2. 如果脚本返回 0 则提示输入用户/密码 如果脚本返回 1 则不提示输入用户/密码并打开位置

一些想法:1.我正在考虑修改https://github.com/winlibs/apache/blob/master/2.4.x/modules/aaa/mod_auth_basic.c 但我不确定这是不是一个好主意(我确信这是一个糟糕的主意)。

  1. 有一些 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 开始,您可以使用授权容器来表达更复杂的授权逻辑。

相关内容