Вопрос: Динамический псевдоним Apache на основе поддомена


У меня есть следующая структура как часть приложения ZF1 -

C:/www/multisite
C:/www/multisite/application
C:/www/multisite/public
C:/www/multisite/client1/uploads
C:/www/multisite/client2/uploads

В настоящее время у меня есть следующий vhost для каждого поддомена -

<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

Это возможно?


5
2017-11-24 21:16


Источник


Я считаю, что это возможно, используя mod_rewrite, чтобы получить часть субдомена. насколько мне известно псевдоним а также aliasmatch относятся только к URI. - ErikE
Как вы думаете, это может вас направить? -> kingcoda.com/how-to-create-wildcard-dns-for-custom-subdomains - Karma


Ответы:


[EDIT] Как я протестировал решение. Теперь он работает как сон, как описано ниже. Я сделал глупое выскальзывание в своем регулярном выражении, которое теперь исправлено.

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

Наконец, я также принял к сведению, что запуск Apache на порту, отличном от 80 (т. Е. Указание его в URL-адресе), нарушает обратную ссылку RewriteRule. Однако я не искал решения для этого.

Я надеюсь, что это будет равно или достаточно близко к тому, что вам нужно.


6
2017-12-10 21:23



Спасибо. Я не знаю, почему я не использовал этот подход в первую очередь. По какой-то причине я застрял в использовании псевдонима. Я не пробовал это, но это, безусловно, простое решение. - nnichols
Мне плохо, потому что у меня не было времени проверить это из-за тонны работы (например, я заметил, что я пропустил экранирование точек в rewritecond regex), но до тех пор, пока я не могу, есть много ресурсов с примерами и вариациями для google. Например: httpd.apache.org/docs/2.4/rewrite/vhosts.html а также vicvijayakumar.com/2013/01/16/mass-virtual-hosting-in-apache и так далее. - ErikE
@nnichols Вы пробовали это еще? Как прошло? - Michael Hampton♦


Попробуйте 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>

3
2017-11-25 10:56



Спасибо, что нашли время, чтобы сделать ваше предложение, но это не решит мою проблему. Это позволяет использовать VirtualScriptAlias, но не VirtualAlias. - nnichols