У меня есть следующая структура как часть приложения ZF1 -
C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads
В настоящее время у меня есть следующий виртуальный хост для каждого поддомена -
<VirtualHost *:80>
DocumentRoot "C:/www/multisite/public"
ServerName client1.multisite.dev
Alias /uploads C:/www/multisite/client1/uploads
FallbackResource /index.php
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "C:/www/multisite/public"
ServerName client2.multisite.dev
Alias /uploads C:/www/multisite/client2/uploads
FallbackResource /index.php
</VirtualHost>
Я хотел бы добиться этого динамически на основе субдомена, но я не могу понять, как это сделать.
{sub_domain}.multisite.dev
приведет к псевдониму
Alias /uploads C:/www/multisite/{sub_domain}/uploads
Это возможно?
[РЕДАКТИРОВАТЬ] Поскольку я тестировал решение. Теперь это работает как сон, как подробно описано ниже. Я допустил глупую ошибку в своем регулярном выражении, которое теперь исправлено.
Идея состоит в том, чтобы использовать RewriteCond, чтобы захватить fqdn в запросе и разделить его. Регулярное выражение захватывает крайнюю левую часть имени домена, на которую затем ссылаются в RewriteRule с использованием% 1. Я также избегаю 'общественный' каталог из перевода, что делает его доступным с использованием пути URI, общего для всех fqdn: s, сопоставленных с сайтом (см. результат теста для конкретного примера).
.
RewriteEngine On
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^/public/
RewriteCond ${lowercase:%{HTTP_HOST}} ^([^.]+)\.multisite\.dev$
RewriteRule ^/(.*) /myApache/runtime/docs/www/multisite/%1/$1
Я создал эту структуру каталогов.
/myApache/runtime/docs/www/multisite/client1/uploads
/myApache/runtime/docs/www/multisite/client2/uploads
/myApache/runtime/docs/www/multisite/public
У каждого каталога есть отдельный файл с именем index.htm. Содержимое index.htm показывает путь к каталогу, в котором он находится.
Серфинг на http://client1.multisite.dev/public/index.htm ИЛИ в http://client2.multisite.dev/public/index.htm дает такой результат:
Hi!
Served from /myApache/runtime/docs/www/multisite/public/index.htm
See you!
Серфинг на http://client1.multisite.dev/uploads/index.htm дает такой результат:
Hi!
Served from /myApache/runtime/docs/www/multisite/client1/uploads/index.htm
See you!
Серфинг на http://client2.multisite.dev/uploads/index.htm дает такой результат:
Hi!
Served from /myApache/runtime/docs/www/multisite/client2/uploads/index.htm
See you!
Я также протестировал случаи смешивания при вводе URL-адреса в моем веб-браузере. Все переводится в нижний регистр.
Замечу, что вы используете Apache в Windows, чьи собственные файловые системы нечувствительны к регистру. Таким образом, нормализация регистра не является обязательным требованием, хотя я лично считаю, что строчные URL: s более эстетичны для просмотра в моем браузере. В файловых системах, чувствительных к регистру, нормализация может быть обязательной, поэтому я включаю ее для завершения.
Наконец, я также отметил, что запуск Apache на порту, отличном от 80 (т.е. необходимость указывать это в URL-адресе) нарушает обратную ссылку RewriteRule. Однако я не искал решения для этого.
Я надеюсь, что это соответствует или достаточно близко к тому, что вам нужно.
Попробуйте mod_vhost_alias: http://httpd.apache.org/docs/2.2/mod/mod_vhost_alias.html Пример:
<VirtualHost *:80>
ServerName apps.mydomain.ltd
ServerAlias *.apps.mydomain.ltd
VirtualDocumentRoot /web/mydomain.ltd/apps/%1/public_html
CustomLog /web/mydomain.ltd/access_apache.log vhost_log_format
ErrorLog /web/mydomain.ltd/logs/error_apache.log
ServerAdmin support@mydomain.ltd
<Directory "/web/mydomain.ltd/apps">
Options FollowSymLinks
Order allow,deny
Allow from all
AllowOverride All
</Directory>
</VirtualHost>