Мне нужно использовать 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.
Для этого:
/ 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>
как используемый вами fpm, вам нужно отправить запрос на FPM в какой-нибудь момент
Обычно он похож на этот
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/path/to/socket.sock
или похож на этот
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/path/to/socket.sock
. (см. https://wiki.apache.org/httpd/PHP-FPM для других опций)
Вам нужно, чтобы файлы не попадали сюда, чтобы ваш блок каталогов использовал ProxyPass !
для остановки их передачи через