
Estou tentando restringir subdiretórios por cliente de um aplicativo contendo relatórios estáticos usando arquivos .htaccess gerados programaticamente com uma lista de usuários para cada cliente, mas embora eu possa demonstrar que o arquivo .htaccess está sendo analisado (500 ISE se contiver lixo, AllowOverride está funcionando) nenhuma das instruções Require mais restritivas está substituindo o Require valid-user na diretiva Location de nível superior.
por exemplo. /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
Eu tenho o LogLevel trace8 ativado para o diretório de relatórios e vejo
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
nada que coloquei no arquivo .htaccess parece ser referenciado, agrupar instruções Require em RequireAll não faz nada, configurar Require all negado não faz nada, o Apache não está tratando as diretivas .htaccess como mais específicas do que a diretiva Location em a configuração em uma parte (superior, esquerda) do URI.
editado: tentei adicionar FileInfo sem efeito. Atualizado o exemplo para ficar mais completo. Localização das configurações /cgi-bin/api/reports/customer1 Exigir usuário CUSTOMER1 funciona muito bem na configuração, eu estava apenas tentando evitar a necessidade de recarregar o servidor da web toda vez que os trabalhos são executados e reconstruir os arquivos .htaccess AuthZ conforme alguns dos trabalhos são executados a cada minuto e eu não queria me esforçar para construir uma ferramenta mais completa, que pudesse recarregar o httpd apenas quando houver alterações materiais no AuthZ, já que em teoria o .htaccess deveria ser capaz de fazer o apache verificar se há alterações no AuthZ em cada acesso sem recargas privilegiadas.
Responder1
Resposta após a pergunta inicial
<Directory>
e<Location>
diretivas não são permitidas dentro.htaccessarquivos (vejaContextoseção).
Basta colocar um separado.htaccessarquivo dentro do/foo/bar/relatórios/pasta contendo as diretivas Auth*
e Require
. Certifique-se de que o caminho para o seu.htpasswdo arquivo é válido (caminhos absolutos devem ser preferidos).
Se ainda assim não funcionar, verifique se oAllowOverride
diretiva foi definida corretamente (ou seja, dentro de um<Directory>
directiva) dentro doanfitrião virtual/configuração do servidor(.confarquivo dentro do/etc/apache2/pasta).
Resposta após a 1ª edição da pergunta
A.htaccessarquivo é o equivalente a uma <Directory>
diretiva dentro de um.confarquivo. No momento você está misturando <Directory>
e <Location>
diretivas para autenticação. Você poderia, por favor, remover as <Location>
diretivas do seu.confarquivo e substitua suas <Directory>
instruções pelas seguintes, deixando o.htaccessarquivos intocados:
<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>
Até você editar sua pergunta, presumi que as <Location>
diretivas foram colocadas dentro de um.htaccessarquivo e apontaria para pastas virtuais em vez de locais reais do sistema de arquivos. No entanto, omanual afirma explicitamente:
É importante nunca usar
<Location>
ao tentar restringir o acesso a objetos no sistema de arquivos. Isso ocorre porque muitos locais de espaço web (URLs) diferentes podem ser mapeados para o mesmo local do sistema de arquivos, permitindo que suas restrições sejam contornadas.
Responder2
Seu Permitir substituir falta directiva.
Apesar do que a documentação para o Exigir Diretiva diz, o comando deve ser:
AllowOverride FileInfo AuthConfig