Apache 2.4 .htaccess Require игнорирует операторы

Apache 2.4 .htaccess Require игнорирует операторы

Я пытаюсь ограничить подкаталоги для каждого клиента в приложении, содержащем статические отчеты, с помощью программно сгенерированных файлов .htaccess со списком пользователей для каждого клиента, но хотя я могу продемонстрировать, что файл .htaccess анализируется (500 ISE, если он содержит мусор, AllowOverride работает), ни один из более строгих операторов Require не переопределяет Require valid-user в директиве Location более высокого уровня.

например, /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, не ссылается на него, заключение операторов Require в RequireAll ничего не делает, установка Require all denied ничего не делает, Apache не обрабатывает директивы .htaccess как более конкретные, чем директива Location в конфигурации в (выше, слева) части URI.

отредактировано: попробовал добавить FileInfo, но безрезультатно. Обновил пример, чтобы сделать его более полным. Расположение настроек /cgi-bin/api/reports/customer1 Требование пользователя CUSTOMER1 отлично работает в конфигурации, я просто пытался избежать необходимости перезагрузки веб-сервера каждый раз при запуске заданий и пересобрать файлы AuthZ .htaccess, поскольку некоторые задания запускаются каждую минуту, и я не хотел тратить усилия на создание более полного инструмента, который может перезагружать httpd только при существенных изменениях AuthZ, поскольку теоретически .htaccess должен быть способен заставить Apache проверять изменения AuthZ при каждом доступе без привилегированной перезагрузки.

решение1

Ответ на начальный вопрос

<Directory>и<Location>директивы не допускаются в пределах.htaccessфайлы (см.Контекстраздел).

Просто поместите отдельный.htaccessфайл в пределах/foo/bar/отчеты/папка, содержащая директивы Auth*и Require. Убедитесь, что путь к вашему.htpasswdфайл действителен (предпочтительнее указывать абсолютные пути).

Если это все еще не работает, проверьте, чтоAllowOverrideдиректива была установлена ​​правильно (т.е. в пределах<Directory>директива) в пределахвиртуальный хост/конфигурация сервера(.confфайл в пределах/etc/apache2/папка).


Ответ после 1-го редактирования вопроса

А.htaccessфайл является эквивалентом директивы <Directory>внутри.confфайл. В данный момент вы смешиваете <Directory>и <Location>директивы для аутентификации. Не могли бы вы удалить <Location>директивы из вашего.confфайл и замените ваши <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

Твой РазрешитьПереопределить директива отсутствует.

Несмотря на то, что документация для Требовать директиву говорит, команда должна быть такой:

AllowOverride FileInfo AuthConfig

Связанный контент