У меня два домена johny.com
и alice.com
и один веб-сервер (apache), управляющий ими. Веб-файлы находятся в /var/www/johny.com
и /var/www/alice.com
и настроены как два виртуальных хоста с правильным ServerName
и DocumentRoot
. Теперь Алиса хочет защитить один из своих файлов в сети от посторонних. Она представляет файл .htaccess
со следующим содержимым
<Files "private.txt">
Require all denied
</Files>
, а также добавляет следующее в конфигурацию apache для своего виртуального хоста
<Directory /var/www/alice.com>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
. И никто не имеет доступа к alice.com/private.txt
. Пока все в порядке.
Теперь Джон решает предоставить псевдоним для сети Алисы, изменив конфигурацию своего виртуального хоста apache на
Alias "/alice" "/var/www/alice.com"
, и любой может увидеть веб-страницу Алисы на john.com/alice
. Но любой может также увидеть содержимое личного файла Алисы.
alice.com/private.txt
дает 403. Запрещено.
john.com/alice/private.txt
показывает содержимое файла .
Что здесь происходит? Разве AllowOverride
не распространяется через директиву Alias
? Как это исправить? Версия Apache - Apache / 2.4.38 (Debian)
. Также добавление тарабарщины в файл .htaccess
дает 500 Internal Server Error только на alice.com
, но не на john.com/alice
, так что похоже на .htaccess
вообще не рассматривается поверх псевдонима.
Проблема заключается в отсутствии директивы AllowOverride All
для каталога /var/www/alice.com
.
В частности, проблема заключается в следующем: (выделено мной)
а также добавляет следующее в конфигурацию apache для ее виртуального хоста
Поскольку вы определили эти разрешения для каталога внутри блока виртуального хоста Алисы, они не не применяется к john.com/alice
, поскольку доступ к каталогу не осуществляется через контекст блока
, соответствующего Алисе. Что касается сервера, псевдоним имеет законный доступ к некоторому каталогу в файловой системе. Так уж получилось, что это тот же каталог, что и корень другого виртуального хоста.
Разделы внутри разделов применяются после соответствующих разделов вне определения виртуального хоста. Это позволяет виртуальным хостам переопределять конфигурацию основного сервера.
Однако, что касается вашего конкретного случая, важно отметить, что это действительно произойдет только в том случае, если контекст VirtualHost
, соответствующий рассматриваемым разделам, действительно вызывается, чего здесь нет.
Есть несколько способов решить эту проблему. Проще всего просто объявить директиву AllowOverride All
в контексте сервера (т.е. не внутри VirtualHost
, .htaccess
, или даже другой блок Directory
.
<Directory "/var/www/alice.com">
Options Indexes FollowSymLinks
Require all granted
AllowOverride All
</Directory>
Еще раз обратите внимание: поскольку вы объявляете AllowOverride All
, вы сможете изменить эти настройки в файле .htaccess
в этом каталоге, независимо от Контекст VirtualHost
, из которого осуществляется доступ к каталогу.
Если вы хотели пофантазировать и не хотели заходить на /var/www/alice.com
с john.com
, но внутри alice.com контекст виртуального хоста
, вы всегда можете настроить uri john.com/alice
на ProxyPass
для http://alice.com
. ].
<VirtualHost "*:80">
...
<Location "/alice">
ProxyPreserveHost Off
ProxyPass http://alice.com/
</Location>
</VirtualHost>
Вам нужно будет включить mod_proxy
и mod_proxy_http
для вышеперечисленного, но это будет соответствовать вашим требованиям для этого конкретного варианта использования, хотя я бы с осторожностью полагался на Расположение
по причинам, которые документация подробно описывает.