Apache .htpasswd não aplicado a subdiretórios

2

Eu tenho vários sites de preparação do WordPress colocados em um diretório temporário. O diretório temporário contém um .htaccess e .htpasswd

.htaccess:

AuthType Basic
AuthName "restricted area"
AuthUserFile /var/www/staging/.htpasswd
require valid-user

.htpasswd

username:PdadsaasdMehzdsadwad

Quando coloco um arquivo nesse diretório, o processo de autenticação é acionado apropriadamente, no entanto, quando coloco um site do WordPress no subdiretório, a autenticação não é exibida.

Exemplo do site do WP: / var / www / staging / algum-site-wp

.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Vhost do site do WP:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName somewpsite.com
        ServerAlias somewpsite.com
        DocumentRoot /var/www/staging/some-wp-site
        <Directory />
                AllowOverride All
        </Directory>
        <Directory /var/www/staging/some-wp-site>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride all
                Require all granted
        </Directory>
</VirtualHost>

meu apache.conf

<Directory /var/www/staging>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
</Directory>

Eu suspeito que preciso modificar o vhost para usar a autenticação, no entanto, como tenho alguns sites nesse diretório, eu preferiria que houvesse uma regra globl que simplesmente acionasse qualquer arquivo colocado nesse subdiretório, não importando o que outra configuração diz. Isso é possível?

    
por Daniel Klose 23.04.2018 / 02:04

2 respostas

1

O problema é que você está usando .htaccess arquivos, mesmo que tenha acesso aos principais arquivos de configuração do Apache.

In general, you should only use .htaccess files when you don't have access to the main server configuration file. There is, for example, a common misconception that user authentication should always be done in .htaccess files, and, in more recent years, another misconception that mod_rewrite directives must go in .htaccess files. This is simply not the case. https://httpd.apache.org/docs/2.4/howto/htaccess.html

Nesse caso, o comportamento inesperado que o arquivo .htaccess em /var/www/staging não é aplicado acontece porque, até onde eu sei, o Apache só procura e aplica os arquivos .htaccess encontrados no diretório DocumentRoot e abaixo . Ou seja apenas /var/www/staging/some-wp-site e seus subdiretórios.

Estou bastante certo de que, se você criar um bloco de diretórios em seu httpd.conf principal para exigir Autenticação em /var/www/staging , ele também se aplicará a todos os subdiretórios e a cada host virtual com DocumentRoot .

    
por 23.04.2018 / 07:24
1

O problema é que a diretiva Require all granted no contêiner <Directory> dentro de seu <VirtualHost> está sobrescrevendo as diretivas de autenticação no arquivo .htaccess no diretório pai . Isso deve ser removido e, em vez disso, permitir acesso ao diretório /var/www (se você tiver sites fora da área "de teste") e restringir o acesso ao subdiretório /var/www/staging , como você está fazendo, embora seja preferível fazer isso na configuração do servidor, não .htaccess .

<Directory />
    AllowOverride All
</Directory>

Além disso, você nunca deve definir AllowOverride All para o diretório raiz. Os documentos do Apache avisam especificamente ao fazer isso:

For security and performance reasons, do not set AllowOverride to anything other than None in your <Directory "/"> block.

Portanto, remova o arquivo /var/www/staging/.htaccess e refaça seus arquivos vHost e apache.conf da seguinte forma:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName somewpsite.com
    ServerAlias somewpsite.com
    DocumentRoot /var/www/staging/some-wp-site
    <Directory /var/www/staging/some-wp-site>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All                
    </Directory>
</VirtualHost>

apache.conf :

<Directory />
    AllowOverride None
    Require all denied
</Directory>

<Directory /var/www>
    Require all granted
</Directory>

<Directory /var/www/staging>
    Options Indexes FollowSymLinks MultiViews
    AuthType Basic
    AuthName "restricted area"
    AuthUserFile /var/www/staging/.htpasswd
    Require valid-user
</Directory>

Você provavelmente também deseja desabilitar MultiViews (e Indexes ), a menos que esteja usando especificamente estes. Caso contrário, MultiViews provavelmente só acabará conflitando com mod_rewrite em algum momento no futuro.

    
por 23.04.2018 / 21:48