После изучения многих направлений с @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/_
Если вы думаете, как это сделать config only , оставьте комментарий, и я отредактирую свой ответ с вашим вкладом.
Переменная недоступна в файлах конфигурации apache.
Взгляните на mod_macro, который позволяет использовать переменные в файлах conf.
Я сделал это с помощью mod_proxy и mod_proxy_fcgi, обратив внимание на раздел « Прокси через обработчик »: https://httpd.apache.org/docs/trunk/mod/mod_proxy_fcgi.html
I мне нужно было запускать PHP 5.6 и PHP 7 на моих локальных сайтах разработчиков, поэтому я установил PHP-FPM как для PHP 5.6, так и для PHP 7 и настроил свою конфигурацию vhosts следующим образом:
<Virtualhost *:80>
VirtualDocumentRoot "/Volumes/CODE/projects/%1"
ServerName sites.hack
ServerAlias *.hack
UseCanonicalName Off
<FilesMatch "\.php$">
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9056
</FilesMatch>
</Virtualhost>
<Virtualhost *:80>
VirtualDocumentRoot "/Volumes/CODE/projects/%1"
ServerName php7.php
Serveralias *.php
UseCanonicalName off
<FilesMatch "\.php$">
Require all granted
SetHandler proxy:fcgi://127.0.0.1:9070
</FilesMatch>
</Virtualhost>
Как объясняется в разделе «Прокси через обработчик» :
Когда FastCGI настроен таким образом, сервер может вычислить больше всего точный PATH_INFO.
С этой конфигурацией я могу:
Посетить локальный сайт разработчиков http: //example.hack
, и он будет извлечен из корневого каталога документа / Volumes / CODE / projects / пример
и передать его в мою службу PHP 5.6 PHP-FPM Прокси-сервер SetHandler: fcgi: //127.0.0.1: 9056
.
Посетите локальный сайт разработчиков http: //example.php
, и он будет извлечен из того же корневого каталога документов / Volumes / CODE / projects / example
, но передаваться в мою службу PHP 7 PHP-FPM SetHandler proxy: fcgi: //127.0.0.1: 9070
У меня еще не было никаких проблем с этим. Это просто и работает.
Следующее сработало у меня для 2.4
UseCanonicalName Off
<VirtualHost *:80>
ServerName auto.dev
ServerAlias *.dev
VirtualDocumentRoot /Users/yourusername/Sites/auto/%1/public
<Directory ~ "/Users/yourusername/Sites/auto/.*/public">
Options Indexes FollowSymlinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Обратите внимание, что я подключаюсь к общей папке в корневой папке