
Я пытаюсь ограничить подкаталоги для каждого клиента в приложении, содержащем статические отчеты, с помощью программно сгенерированных файлов .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