Apache:基于 URL 后缀的代理

Apache:基于 URL 后缀的代理

我的团队编写了一个内部 BI 服务器,它在/users/daily或等链接处生成 HTML 报告/updates/questions

服务器写在Grails,并且它与经典的 Apache-Tomcat 设置完美配合:

ProxyPass         /     http://localhost:8080/ nocanon
ProxyPassReverse  /     http://localhost:8080/

在此处输入图片描述

所以

https://example.com/users/daily

内部代理

http://localhost:8080/users/daily

并通过 Tomcat servlet 提供服务。

服务器成功了,我想将其部署三次,部署到 3 个不同的系统,通过 URL 后缀(/dev, /stg, /prod)区分:

在此处输入图片描述

这意味着https://example.com/dev/users/daily将从 进行代理http://localhost:8080/users/daily,并将https://example.com/prod/users/daily从 提供服务http://localhost:8082/users/daily

我尝试了一些 ApacheRewriteRuleProxyPass规则,但找不到有效的组合。

如何在 Apache 中执行基于后缀的内部路由,并使内部链接有效?

答案1

你可以这样做

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

等等。这将为不同的 URL 提供不同的代理,并从 URL 中删除前导 /dev、/staging 或 /prod。

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

另一个可能更简单的选择是:在 DNS 中创建新的主机名:dev.biserver.example.com、staging.biserver.example.com 和 prod.biserver.example.com。然后 URL 重写就会消失,您可以使用虚拟主机做任何事情,例如:

<VirtualHost *:443>
  ServerName dev.biserver.example.com
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
</VirtualHost>

等等。

相关内容