Массовый виртуальный хостинг с Apache 2.4

Я хотел бы использовать значение, установленное VirtualDocumentRoot в RewriteRule.

В документации Apache говорится:

Еще одна вещь, которую необходимо определить, — это корень документа (настраивается с помощью DocumentRoot и доступен для сценариев CGI через переменную среды DOCUMENT_ROOT). В обычной конфигурации это используется основным модулем при сопоставлении URI с именами файлов, но когда сервер настроен для динамического виртуального хостинга, эту работу должен взять на себя другой модуль (либо mod_vhost_alias, либо mod_rewrite), который имеет другой способ сделать отображение. Ни один из этих модулей не отвечает за настройку переменной среды DOCUMENT_ROOT, поэтому, если какие-либо документы CGI или SSI используют ее, они получат вводящее в заблуждение значение.

Судя по документации, я не смогу использовать %{DOCUMENT_ROOT} в RewriteRule. Но после поиска альтернативных решений я нашел этот тикет (название: < em>Переменная среды DOCUMENT_ROOT неправильно задана с помощью VirtualDocumentRoot), говоря, что это было «исправлено в версии 2.4.1».

Я использую последнюю (стабильную) версию Apache:

$ httpd -v
Server version: Apache/2.4.9 (Unix)
Server built:   Jun 18 2014 03:07:48

... но, похоже, это не работает для меня. При тестировании %{DOCUMENT_ROOT} имеет значение по умолчанию, установленное DocumentRoot в httpd.conf. Я хотел бы, чтобы %{DOCUMENT_ROOT} (или любая другая переменная, которую я мог бы использовать) динамически устанавливалась VirtualDocumentRoot.

Вот что я хотел бы использовать в httpd-vhosts.conf:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

Есть ли решение?


person Matworms    schedule 20.06.2014    source источник


Ответы (1)


Посмотрев во многих направлениях с @John Auld (спасибо за ваше время и помощь), я наконец нашел решение. Как я сказал в предыдущем комментарии, это не 100 % идеально, но достаточно хорошо для меня.

Для ясности вот что я хотел иметь в httpd-vhosts.conf:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

И вот что я придумал:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2/%-3"

    RewriteCond %{SERVER_NAME} (?:([^.]+)\.)?([^.]+)\.dev
    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/usr/local/var/www/.dev/%2/${:%1|www}/$1" [P]
</VirtualHost>

Я использую RewriteCond для захвата частей %{SERVER_NAME} и повторного использования их в RewriteRule.

Есть две группы захвата: субдомен (%1) и домен (%2). Субдомен является необязательным, поэтому я использую синтаксис ${map:value|default}, чтобы установить значение по умолчанию для субдомена, когда он пуст.

VirtualDocumentRoot имеет собственное значение по умолчанию, когда часть (%N.M) недоступна. Как сказано в документации:

Если N или M больше, чем количество доступных частей, интерполируется одно подчеркивание.

Вот почему мне пришлось использовать небольшой «трюк», чтобы заставить его работать с необязательным поддоменом:

ln -sfv /path/to/the/project/www /path/to/the/project/_

Если вы думаете, как сделать это «только для конфигурации», оставьте комментарий, и я отредактирую свой ответ с учетом вашего вклада.

person Matworms    schedule 23.06.2014