AllowOverride не работает для сайта с псевдонимом

У меня два домена 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 вообще не рассматривается поверх псевдонима.

0
задан 26 September 2020 в 15:00
1 ответ

Проблема заключается в отсутствии директивы 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 для вышеперечисленного, но это будет соответствовать вашим требованиям для этого конкретного варианта использования, хотя я бы с осторожностью полагался на Расположение по причинам, которые документация подробно описывает.

1
ответ дан 26 September 2020 в 21:15

Теги

Похожие вопросы