Я хотел бы, чтобы обслуживать несколько субдоменов с моей веб-сервер:Переназначает запрос на другой локальный путь
example.com
projects.example.com
blog.example.com
wiki.example.com
...
корневой документ создается следующим образом:
ServerName example.com
ServerAlias *.example.com
VirtualDocumentRoot "/var/www/%0/public"
Это ж orks, так как он автоматически устанавливает корень документа в соответствующий поддомен. Однако мое следующее требование заключается в том, что он должен определить, существует ли папка public
в корне документа, а если нет, то прежде всего отправьте файл из одного каталога.
Большинство моих приложений написаны с помощью Laravel, поэтому они поставляются с папкой public
, однако иногда я просто хочу быстро создать новый скрипт, который не имеет public
, или развернуть внешнее программное обеспечение, которое этого не делает.
Поэтому корень документа для example.com
(который только служит статический index.html
и style.css
) должно быть /var/www/example.com/
, а не /var/www/example.com/public
. Я попытался это с помощью правила перезаписи:
<If "!-d '/var/www/' . %{HTTP_HOST} . '/public'">
RewriteEngine on
RewriteRule^"/var/www/%{HTTP_HOST}" [L,QSA]
</If>
Это является результатом журнал ошибок переписывания:
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] init rewrite engine with requested uri/
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] pass through/
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] add path info postfix: /var/www/example.com -> /var/www/example.com/public/
[rewrite:trace3] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] applying pattern '^' to uri '/var/www/example.com/public/'
[rewrite:trace2] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] rewrite '/var/www/example.com/public/' -> '/var/www/example.com'
[rewrite:trace1] [pid 32153] mod_rewrite.c(475): [client 62.159.226.12:27139] 62.159.226.12 - - [example.com/sid#7f6588016340][rid#7f6587f810a0/initial] [perdir *If/] initial URL equal rewritten URL: /var/www/example.com [IGNORING REWRITE]
Как вы можете видеть, он отображает его правильно, но по какой-то причине не служить файл оттуда (я предполагаю, что это потому, что он не добавляет index.html
или что-нибудь подобное).
Как мне обойти это?
У вас есть пример для меня? Я попробовал это с [этой конфигурацией] (http://pastebin.com/i7vkfJ16), что, на мой взгляд, является тем, что вы предложили. Это все еще приводит к обнаружению цикла. Если я использую флаг 'END' для' RewriteRule', он работает так, как ожидалось, но, очевидно, не загружает больше правил перезаписи из моего .htaccess и, таким образом, маршруты приложений разбиваются там, где существует папка 'public' – Padarom
Вот пример журнала ошибок (с уровнем 'rewrite: trace3'), когда я использую его без флага' [END] ': http://pastebin.com/c6KDdh5b – Padarom