Переназначить запрос на другой локальный путь

Я хотел бы обслуживать несколько поддоменов с помощью своего веб-сервера:

example.com
Projects.example.com
blog.example.com
wiki.example.com
...

Корень документа устанавливается следующим образом:

ServerName   example.com
ServerAlias   *.example.com
VirtualDocumentRoot "/var/www/%0/public"

Это работает, поскольку автоматически устанавливает корень документа в соответствующий субдомен. Мое следующее требование, однако, состоит в том, что он должен определять, существует ли папка 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 или что-то подобное).

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


person Padarom    schedule 07.09.2016    source источник


Ответы (1)


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

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

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

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

person covener    schedule 08.09.2016
comment
У тебя есть пример для меня? Я попробовал это с этой конфигурацией, которую, насколько я понимаю, вы предложили. Это по-прежнему приводит к обнаружению петли. Если я использую флаг END для RewriteRule, он работает, как и ожидалось, но, очевидно, больше не загружает правила перезаписи из моего .htaccess, и поэтому маршруты приложений нарушаются там, где существует папка public - person Padarom; 08.09.2016
comment
Вот пример журнала ошибок (с уровнем rewrite:trace3), когда я использую его без флага [END]: pastebin.com/c6KDdh5b< /а> - person Padarom; 08.09.2016