基于多个 URL 的反向代理

基于多个 URL 的反向代理

在互联网上搜索了相当长一段时间后,我仍然在努力配置我的 Apache Proxy 虚拟主机。

我的设置非常简单:

  • 服务器托管多个 NodeJS-express 应用程序
    • 一个手工制作的 REST API(监听端口 8080)
    • 管理员Mongo(监听端口8081)
  • Apache 监听端口 80,可通过 10.8.0.1 访问

以下是接近正常工作的 Apache 配置文件:

<VirtualHost *:80>
    <Location /custom>
        RewriteEngine on
        RewriteRule ^/custom/(.*) /$1
        ProxyPass http://localhost:8080/
        ProxyPassReverse http://localhost:8080/
    </Location>

    <Location /mongo>
        RewriteEngine on
        RewriteRule ^/mongo/(.*) /$1
        ProxyPass http://localhost:8081/
        ProxyPassReverse http://localhost:8081/
    </Location>
</Virtualhost>

这个 Vhost 的灵感来自于这篇文章:Apache:基于 URL 后缀的代理

主要问题是,当我尝试 GET 时,http://10.8.0.01/mongo/我被重定向到http://10.8.0.1/app/login/(express-app 正在执行此操作),这给了我一个 404 错误,因为我的 Apache 没有任何可提供的服务/

我如何匹配以 开头的所有 URL 来/mongo/为我的应用程序提供监听http://127.0.0.1:8081/

任何建议都值得赞赏。

答案1

主要问题是当我尝试获取http://10.8.0.01/mongo/我被重定向到http://10.8.0.1/app/login/(express-app 正在执行此操作)这给了我一个 404 错误,因为我的 Apache 在 / 上没有任何可提供的服务。

这是预料之中的,因为你已对其进行了配置。你引用的帖子中甚至提到了这一点:

但有一个问题:从 Tomcat 返回的 HTML 中的链接将具有 / 的 URL 基础,而不是 /dev 等。要将前缀重新添加到 HTML 中,您必须使用 mod_proxy_html 或等效程序来解析 HTML、修改它并将其重新组合在一起。这可以工作,但会降低性能;格式错误的 HTML 可能会被破坏;您还必须用 CSS 和 Javascript 重写 URL;并且 Javascript 可能无法正确执行。

因此,当您向 /mongo 发出请求时,它将作为 发送到应用程序/,这意味着所有返回都将作为/,因此重定向将以 开头,/而不是/mongo/...

如链接的帖子所述,请检查文档或使用子域名。

根据您的实际使用情况,您可能能够使用以下内容:

<LocationMatch ^/custom>
  ProxyPass http://localhost:8080/
  ProxyPassReverse http://localhost:8080/
</LocationMatch>

<LocationMatch ^/mongo>
  ProxyPass http://localhost:8081/
  ProxyPassReverse http://localhost:8081/
</LocationMatch>

相关内容