我正在尝试使用以编程方式生成的包含每个客户的用户列表的 .htaccess 文件来限制包含静态报告的应用程序的每个客户端子目录,但尽管我可以证明 .htaccess 文件正在被解析(如果它包含垃圾,则 500 ISE,AllowOverride 正在运行),但没有一个更严格的 Require 语句会覆盖更高级别 Location 指令中的 Require valid-user。
例如 /etc/httpd/conf.d/app.conf
<VirtualHost *:80>
ServerName app
RewriteEngine on
RewriteRule ^/cgi-bin\/api\/(\w+)$ /var/www/cgi-bin/App.cgi?mode=json&request=$1 [QSA,H=cgi-script]
<Directory "/var/www/cgi-bin/">
Options ExecCGI
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
<Location /cgi-bin/>
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Location>
<Location /cgi-bin/api/>
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Location>
</VirtualHost>
/var/www/cgi-bin/api/reports/customer1/.htaccess
Require user CUSTOMER1
我对报告目录启用了 LogLevel trace8,然后我看到
AH01626: authorization result of Require valid-user : denied (no authenticated user yet)
AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
AH01626: authorization result of Require valid-user : granted,
AH01626: authorization result of <RequireAny>: granted
Response sent with status 200
我放入 .htaccess 文件中的任何内容似乎都没有被引用,在 RequireAll 中包装 Require 语句没有任何作用,设置 Require all denied 没有任何作用,Apache 并没有将 .htaccess 指令视为比配置中位于 URI 的(较高、较左边)部分的 Location 指令更具体。
已编辑:尝试添加 FileInfo,但无效。更新示例以使其更完整。设置位置 /cgi-bin/api/reports/customer1 要求用户 CUSTOMER1 在配置中工作正常,我只是想避免每次运行作业时都需要重新加载 Web 服务器,并重建 .htaccess AuthZ 文件,因为有些作业每分钟运行一次,我不想花精力构建一个更完整的工具,该工具只能在有实质性 AuthZ 更改时重新加载 httpd,因为理论上 .htaccess 应该能够让 apache 在每次访问时检查 AuthZ 更改,而无需特权重新加载。
答案1
初始问题后的回答
<Directory>
和<Location>
指令不允许在.htaccess文件(参见语境部分)。
只需放置一个单独的.htaccess文件内/foo/bar/报告/文件夹包含Auth*
和Require
指令。请确保您的密码文件有效(应优先使用绝对路径)。
如果仍然不起作用,请检查AllowOverride
指令设置正确(即在<Directory>
指令)虚拟主机/服务器配置(配置文件文件内/etc/apache2/文件夹)。
问题第一次编辑后的回答
A.htaccess<Directory>
文件相当于配置文件文件。目前,您正在混合<Directory>
和<Location>
指令以进行身份验证。请从<Location>
您的配置文件文件并<Directory>
用以下内容替换您的说明,同时让.htaccess未受影响的文件:
<Directory "/var/www/cgi-bin/">
Options ExecCGI
AuthType Basic
AuthName "App Server"
AuthUserFile /etc/httpd/conf.d/app.passwd
require valid-user
</Directory>
<Directory "/var/www/cgi-bin/api/">
AuthType Basic
AuthName "App API"
AuthUserFile /etc/httpd/conf.d/app-api.passwd
Require valid-user
LogLevel trace8
</Directory>
<Directory "/var/www/cgi-bin/api/reports/">
AllowOverride FileInfo AuthConfig
Options +Indexes +FollowSymLinks -ExecCGI
IndexOptions +NameWidth=*
SetHandler default-handler
LogLevel trace8
</Directory>
直到你编辑你的问题,我假设这些<Location>
指令被放在.htaccess文件,并指向虚拟文件夹,而不是实际的文件系统位置。然而,手册明确指出:
尝试限制对文件系统中对象的访问时,切勿使用此选项
<Location>
。这是因为许多不同的网络空间位置 (URL) 可能映射到同一文件系统位置,从而允许规避您的限制。