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

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

Документация Apache гласит:

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

Ссылаясь на документацию, кажется, я не смогу использовать %{DOCUMENT_ROOT} в RewriteRule, Но после поиска альтернативных решений я обнаружил, что этот тикет (заголовок: переменная окружения 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>

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

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/_

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

Другие вопросы по тегам