У меня есть Apache httpd на порту 80 и сервер Morbo httpd на порту 3000, обслуживающий код Perl Mojolicious. Morbo доступен только с localhost.
Теперь я хочу настроить виртуальный хост с прокси, чтобы статические файлы обслуживались Apache, а динамический контент - сервером Morbo.
Это моя конфигурация виртуального хоста:
<VirtualHost *:80>
ServerName mojo.myhost.com
DocumentRoot /opt/mojo/public
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^(.*) http://localhost:3000$1 [NS,P,L]
ProxyPassReverse / http://mojo.myhost.com
</VirtualHost>
Проблема в том, что когда я пытаюсь получить доступ http://mojo.myhost.com/
Подзапрос Apache выдается Apache, а запрос, отправленный в Morbo, http://localhost:3000/error/noindex.html
и нет http://localhost:3000/
.
Вот часть журнала мод-перезаписи:
[rid#2b20905c58e0/initial] (2) init rewrite engine with requested uri /
[rid#2b20905c58e0/initial] (3) applying pattern '^(.*)' to uri '/'
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-f' => matched
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-d' => not-matched
[rid#2b20905c58e0/initial] (1) pass through /
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.php
[rid#2b20905cb910/subreq] (1) pass through /index.php
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.html
[rid#2b20905cd920/subreq] (1) pass through /index.html
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.html.var
[rid#2b20905cb910/subreq] (1) pass through /index.html.var
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.htm
[rid#2b20905cd920/subreq] (1) pass through /index.htm
[rid#2b20905caf40/initial/redir#1] (2) init rewrite engine with requested uri /error/noindex.html
[rid#2b20905caf40/initial/redir#1] (3) applying pattern '^(.*)' to uri '/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-f' => matched
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-d' => matched
[rid#2b20905caf40/initial/redir#1] (2) rewrite '/error/noindex.html' -> 'http://localhost:3000/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (2) forcing proxy-throughput with http://localhost:3000/error/noindex.html
[rid#2b20905caf40/initial/redir#1] (1) go-ahead with proxy request proxy:http://localhost:3000/error/noindex.html [OK]
я добавил NS
флаг RewriteRule
но subreq по-прежнему изменяет URL-адрес до того, как он будет передан в Morbo. Как я могу заставить Apache передать / вместо /error/noindex.html в Morbo?
Если оба RewriteCond
удаляются из конфигурации виртуального хоста, тогда он работает, но статические файлы также хранятся на сервере Morbo (что мне не очень нравится).
Вот что происходит, шаг за шагом:
/
-f
состояние и обнаруживает, что /
не является файлом, поэтому он соответствует условию.-d
состояние и обнаруживает, что /
является каталог, поэтому он не соответствует условию./
должен иметь индексный файл; поэтому он пытается найти все перечисленные индексные файлы./error/noindex.html
вместо./error/noindex.html
, поэтому на этот раз выполняется запрос проксиРешение:
Добавьте RewriteRule, которое соответствует только пустому /
и пусть тот выполнит перезапись. Пример:
RewriteRule ^/$ http://localhost:3000 [NS,P,L]
ProxyPassReverse / http://mojo.myhost.com
Это соответствует запросу только на /
.