2016-09-07 2 views
0

Я хотел бы, чтобы обслуживать несколько субдоменов с моей веб-сервер:Переназначает запрос на другой локальный путь

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 или что-нибудь подобное).

Как мне обойти это?

ответ

1

Это потому, что ядро ​​видит, что несуществующий public/и разбивает его из текущего имени файла и на PATH_INFO. Даже флаг [DPI] здесь не поможет, поскольку он удаляет PATH_INFO в последнюю минуту в качестве побочного эффекта перезаписи.

К сожалению, это изменение, в котором вы пытаетесь повернуть PATH_INFO, попадает в «обнаружение цикла» mod_rewrite и ошибочно принимается за изменение имени файла.

Вы должны инвертировать свою логику, чтобы в нее не вводили паттерн PATH_INFO. Затем переписывание будет необязательно добавлять открытый суффикс вместо его удаления.

Это также позволяет отказаться от отрицания и действительно всего, просто используя типичный тест -d в RewriteCond.

+0

У вас есть пример для меня? Я попробовал это с [этой конфигурацией] (http://pastebin.com/i7vkfJ16), что, на мой взгляд, является тем, что вы предложили. Это все еще приводит к обнаружению цикла. Если я использую флаг 'END' для' RewriteRule', он работает так, как ожидалось, но, очевидно, не загружает больше правил перезаписи из моего .htaccess и, таким образом, маршруты приложений разбиваются там, где существует папка 'public' – Padarom

+0

Вот пример журнала ошибок (с уровнем 'rewrite: trace3'), когда я использую его без флага' [END] ': http://pastebin.com/c6KDdh5b – Padarom

Смежные вопросы