Я хотел бы обслуживать несколько поддоменов с помощью своего веб-сервера:
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
или что-то подобное).
Как мне обойти это?