![基于多个 URL 的反向代理](https://linux22.com/image/722787/%E5%9F%BA%E4%BA%8E%E5%A4%9A%E4%B8%AA%20URL%20%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
在互联网上搜索了相当长一段时间后,我仍然在努力配置我的 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>