Apache 2.4 .htaccess Require 语句被忽略

Apache 2.4 .htaccess Require 语句被忽略

我正在尝试使用以编程方式生成的包含每个客户的用户列表的 .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) 可能映射到同一文件系统位置,从而允许规避您的限制。

答案2

你的 允许覆盖 指令缺乏。

尽管 Require 指令 说,命令应该是:

AllowOverride FileInfo AuthConfig

相关内容