我的设置有点尴尬,使用 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
从端口 3001 上的 API 服务器检索正确的数据GET /
从端口 3002 检索页面
但是,请求GET /game
(game
文件夹中有一个index.html
文件)确实得到了服务,但将 URL 更改为http://localhost:3000/game
。或者更准确地说:它会更改为我在 Apache2 vhost 中指定的任何 URL,如果我将其放入example.org:3000
那里,它将尝试提供服务example.org:3000/game
,忽略 [P] 代理指令。
事物仅有的folder/index.html
当 lighttpds “重写” 以提供文件请求时出错folder/
。有人能告诉我为什么吗?
Chrome 和 Firefox 的行为相同,我没有收到任何 HTTP 重定向。
答案1
这可能是 lighttpd 服务器的一些重定向混杂,因为您没有ProxyPassReverse
指定指令(它也可以工作RewriteRule
)。话虽如此,我没有看到您的配置中有任何特别需要 mod_rewrite 来执行此代理的内容:当有专用指令可以完成这项工作时,最佳做法是避免使用它。
您介意尝试一下这个吗?
<Location />
ProxyPass http://localhost:3000
ProxyPassReverse http://localhost:3000
</Location>