Назад | Перейти на главную страницу

Динамический псевдоним Apache на основе субдомена

У меня есть следующая структура как часть приложения 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, сопоставленных с сайтом (см. результат теста для конкретного примера).

  • Я отключил файл виртуальных хостов для этого эксперимента.
  • Мои точки DNS client1.multisite.dev и client2.multisite.dev на мой тестовый сервер Apache 2.2.
  • Следующий фрагмент находится в моем httpd.conf.

.

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>