У меня есть несколько промежуточных сайтов 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>
Вы, вероятно, также захотите отключить MultiViews
(и Indexes
), если вы специально не используете их. В противном случае, 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
там.