Назад | Перейти на главную страницу

Apache .htpasswd не применяется к подкаталогам

У меня есть несколько промежуточных сайтов WordPress, помещенных в промежуточный каталог. Промежуточный каталог содержит файлы .htaccess и .htpasswd.

.htaccess:

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

.htpasswd

username:PdadsaasdMehzdsadwad

Когда я помещаю файл в этот каталог, процесс аутентификации запускается соответствующим образом, однако, когда я помещаю сайт WordPress в подкаталог, аутентификация не отображается.

Пример сайта WP: / var / www / staging / some-wp-site

.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>

WP сайта Vhost:

<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>

мой apache.conf

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

Я подозреваю, что мне нужно изменить vhost, чтобы использовать аутентификацию, однако, поскольку у меня довольно много сайтов в этом каталоге, я бы предпочел, чтобы был глобальный rul, который просто запускает любые файлы, помещенные в этот подкаталог, независимо от того, что говорит другая конфигурация . Это возможно?

Проблема в том, что Require all granted директива в <Directory> контейнер внутри вашего <VirtualHost> переопределяет директивы аутентификации в .htaccess файл в родитель каталог. Его следует удалить и вместо этого разрешить доступ к /var/www каталог (если у вас есть сайты за пределами «промежуточной» области) и ограничьте доступ к /var/www/staging подкаталог, как вы это делаете, хотя было бы предпочтительнее сделать это в конфигурации сервера, а не .htaccess.

<Directory />
    AllowOverride All
</Directory>

Кроме того, никогда не следует устанавливать AllowOverride All для корневого каталога. В Документы Apache специально предостерегают от делая это:

По соображениям безопасности и производительности не устанавливайте AllowOverride ни к чему, кроме Ничего в вашем <Directory "/"> блок.

Итак, удалите /var/www/staging/.htaccess зарегистрируйте и переделайте свой vHost и apache.conf файлы примерно следующего вида:

<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>

Вы, вероятно, также захотите отключить MultiViewsIndexes), если вы специально не используете их. В противном случае, MultiViews только, вероятно, в какой-то момент в будущем конфликтует с mod_rewrite.

Проблема действительно в том, что вы используете .htaccess файлы, даже если у вас есть доступ к основным файлам конфигурации Apache.

Как правило, вы должны использовать файлы .htaccess только тогда, когда у вас нет доступа к основному файлу конфигурации сервера. Существует, например, распространенное заблуждение, что аутентификация пользователя всегда должна выполняться в файлах .htaccess, а в последнее время возникло еще одно заблуждение, что директивы mod_rewrite должны входить в файлы .htaccess. Это просто не тот случай. https://httpd.apache.org/docs/2.4/howto/htaccess.html

В этом случае неожиданное поведение, которое .htaccess файл в /var/www/staging не применяется, потому что, насколько я знаю, Apache будет только искать и применять любые .htaccess файлы, находящиеся в каталоге DocumentRoot и ниже. Т.е. только /var/www/staging/some-wp-site и их подкаталоги.

Я совершенно уверен, что если вы создадите блок каталога в своем основном httpd.conf, чтобы требовать аутентификации на /var/www/staging он также будет применяться ко всем подкаталогам и каждому виртуальному хосту с DocumentRoot там.