VirtualHost на основе CNAME с подстановочными доменами в Apache

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

У меня есть домен: example.com. Мы развернули веб-сайт в / var / www / html, доступный через www.example.com. Кроме того, мы разрешаем пользователям регистрироваться и получать доступ к содержимому (эти пользователи затем становятся нашими арендаторами). Такое зависящее от клиента содержимое развертывается в / var / www / tenants. Для каждого из арендаторов мы создаем поддомен. Например, для арендатора A мы создаем tenanta.example.com. Каждый раз при переходе по этому URL-адресу он может получить доступ к некоторому контенту, относящемуся к клиенту A.

Теперь клиент A хочет настроить частный домен для tenanta.example.com. Допустим, тщательный домен: help.tenanta.com, где tenanta.com - это домен, зарегистрированный арендатором A. Он настраивает запись CNAME, чтобы указать help.tenanta.com на tenanta.example.com.

Теперь дело за в часть Apache. Как мне настроить файл конфигурации так, чтобы запрос на help.tenanta.com получал контент из / var / www / tenants вместо / var / www / html?

Вот что я пробовал:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    ServerAlias example.com, cdn.example.com
    # See: http://stackoverflow.com/questions/2297403/http-host-vs-server-name
    UseCanonicalName on

    DocumentRoot /var/www/html
<VirtualHost>

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerAlias *.example.com
    UseCanonicalName on

    DocumentRoot /var/www/tenants
<VirtualHost>

Но в такой настройке запрос на help.tenanta.com по-прежнему отправляется в / var / www / html вместо /var/www/tenants.

. Примечание: аналогичные вопросы задавались по serverfault, например: Виртуальный хост Apache на основе CNAME

, но они не решают проблему поддомена с подстановочными знаками. DocumentRoot находится в / var / www / html и работает хорошо. Включен PHP, выполняются скрипты и т. Д. Теперь я также хочу использовать то же древо, что и ...

Я использую и нуждаюсь в php_fpm7.0 в debian 9 (stretch) apache 2.4.25. DocumentRoot - это / var / www / html и работает хорошо. Php включен, скрипты выполняются и т. Д ... Теперь я также хочу использовать ту же древовидность, что и файловая система, через модуль apache dav_fs.

Для этого:

  1. / var / www / webdav - это символическая ссылка на / var / www / html , поэтому я могу назвать один и тот же каталог с двумя разными именами в файле конфигурации apache и создать две разные конфигурации на основе имени доступа
  2. . Я получаю доступ к webdav с помощью / webdav URL. Внутри конфигурации apache / webdav - это псевдоним, указывающий на / var / www / webdav . Теперь мне нужно только настроить раздел , и все должно быть хорошо.

Пока что почти работает: я могу получать и размещать файлы, создавать каталоги, переименовывать файлы и т. д ... с помощью webdav, но файлы PHP продолжают выполняться, когда я ПОЛУЧАЮ их через псевдоним webdav. Итак, если я хочу отредактировать файл .php, я действительно получаю результат скрипта в моем редакторе, что бесполезно.

Мои настройки на данный момент:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html>
        AllowOverride All
        require all granted
        Options Indexes FollowSymLinks MultiViews
    </Directory>

    Alias /webdav /var/www/webdav
    <Directory /var/www/webdav>
        SetHandler none
        Options -ExecCGI -FollowSymLinks -Includes -Indexes -MultiViews
        AddType text/plain php php3 php4 php5 php7 php8 pht phptml phps
        AllowOverride None
        DAV On
        <ifmodule mod_dir.c>
            DirectoryIndex disabled
        </ifmodule>
        <ifmodule mod_rewrite.c>
            RewriteEngine Off
        </ifmodule>
        <Files ~ "^\.ht"> # need to be able to edit .htaccess files.
            require all granted
        </Files>
    </Directory>
</VirtualHost>

Каков правильный способ предотвратить выполнение php в / var Каталог / www / webdav?

Правка и решение

Поскольку Debian использует прокси SetHandler ": unix: /run/php/php7.0-fpm.sock | fcgi: // localhost" / etc / apache2 / conf-available / php7.0-fpm.conf , мне нужно использовать SetHandler none . Но в разделе уже слишком поздно. он должен использоваться в <Местоположение> , это интерпретируется достаточно рано. Я также включил ProxyPass! , как предлагает @exussum (следует поместить в ?). В данном случае это useles, но прокси-сервер в любом случае здесь нежелателен.

Также обратите внимание, что мне пришлось поместить аутентификацию / авторизацию в . Он работал в , но только клиент трупа CLI мог получить доступ к коллекции webdav. Когда аутентификация / авторизация находится в , файловый менеджер nautilus может получить доступ к файлам.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /var/www/html>
        AllowOverride All
        require all granted
        Options Indexes FollowSymLinks MultiViews
    </Directory>

    Alias /webdav /var/www/webdav
    <Location /webdav>
        <IfModule mod_proxy.c>
            ProxyPass !
        </IfModule>
        SetHandler none
        AddType text/plain php php3 php4 php5 php7 php8 pht phptml phps
    </Location>
    <Directory /var/www/webdav>
        AuthName "Restricted Area"
        AuthType Basic
        AuthUserFile    "/etc/apache2/user-password"
        require valid-user
        Options -ExecCGI -FollowSymLinks -Includes -Indexes -MultiViews
        AllowOverride None
        DAV On
        <ifmodule mod_dir.c>
            DirectoryIndex disabled
        </ifmodule>
        <ifmodule mod_rewrite.c>
            RewriteEngine Off
        </ifmodule>
        <Files ~ "^\.ht"> # need to be able to edit .htaccess files.
            require all granted
        </Files>
    </Directory>
</VirtualHost>
2
задан 21 January 2018 в 15:13
1 ответ

как используемый вами fpm, вам нужно отправить запрос на FPM в какой-нибудь момент

Обычно он похож на этот

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/path/to/socket.sock

или похож на этот

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/path/to/socket.sock

. (см. https://wiki.apache.org/httpd/PHP-FPM для других опций)

Вам нужно, чтобы файлы не попадали сюда, чтобы ваш блок каталогов использовал ProxyPass ! для остановки их передачи через

.
2
ответ дан 3 December 2019 в 11:26

Теги

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