У меня небольшая неудобная установка с веб-сервером Apache 2, который является привратником и проксирует трафик на основе входящего домена:
<VirtualHost *:80>
ServerName example.org
RewriteEngine On
RewriteRule ^/(.*) http://localhost:3000/$1 [P]
</VirtualHost>
Работает под localhost:3000
У меня запущен lighttpd, который обслуживает статический контент и действует как обратный прокси для двух других служб, работающих на портах 3001 и 3002. Конфигурация выглядит так:
# lighttpd will also be used to forward requests to node.js
server.modules = (
"mod_proxy"
)
# This config is meant to work relative to certain directories,
# it is not meant to be used somewhere globally in /etc/
var.projectRoot = var.CWD
# Setting up paths
server.document-root = var.projectRoot + "/client"
# Port to listen on
server.port = 3000
# We don't want to provide names of individual files
index-file.names = ( "index.html" )
# Serve all API calls to the API server
$HTTP["url"] =~ "^/api/.*$" {
proxy.server = ( "" => (
( "host" => "127.0.0.1", "port" => 3001 )
)
)
}
# Serve all pages that are not known as static or api routes
# to the page instance
$HTTP["url"] !~ "^/(assets|game|ige|api).*$" {
proxy.server = ( "" => (
( "host" => "127.0.0.1", "port" => 3002 )
)
)
}
Вся установка отлично работает в следующих случаях:
GET /assets/textures/sources.txt
обслуживает статический файл из client
каталог.GET /api/games/byId/123
получает правильные данные с сервера API на порт 3001GET /
получает страницу из порта 3002Однако просьба GET /game
(где game
в папке есть index.html
файл) обслуживается, но меняет URL-адрес на http://localhost:3000/game
. Или, если быть более точным: он изменяется на любой URL-адрес, который я указал в vhost Apache2, если я поставлю example.org:3000
там он будет пытаться служить example.org:3000/game
, Игнорирование директивы прокси [P].
вещи только идет не так, когда lighttpds "переписывает", чтобы доставить folder/index.html
файлы для folder/
Запросы. Кто-нибудь может сказать мне, почему?
Поведение одинаково для Chrome и Firefox, и я не получаю перенаправления HTTP.
Это могло быть какое-то перенаправление сервером lighttpd, поскольку у вас нет ProxyPassReverse
указана директива (работает с RewriteRule
слишком). Тем не менее, я не вижу в вашей конфигурации ничего, что специально требует, чтобы mod_rewrite выполнял этот прокси: лучше всего избегать его использования, когда есть специальные директивы для выполнения этой работы.
Не могли бы вы попробовать это вместо этого?
<Location />
ProxyPass http://localhost:3000
ProxyPassReverse http://localhost:3000
</Location>