为什么 lighttpd 或 Apache2 代理在访问 index.html 时会更改我的 URL?

为什么 lighttpd 或 Apache2 代理在访问 index.html 时会更改我的 URL?

我的设置有点尴尬,使用 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 /gamegame文件夹中有一个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>

相关内容