Apache:基于URL后缀的代理

Ada*_*tan 3 tomcat proxy redirect apache-2.2

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

服务器是用Grails编写的,它与经典的 Apache-Tomcat 设置完美配合:

ProxyPass         /     http://localhost:8080/ nocanon
ProxyPassReverse  /     http://localhost:8080/
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

所以

https://example.com/users/daily
Run Code Online (Sandbox Code Playgroud)

在内部代理到

http://localhost:8080/users/daily
Run Code Online (Sandbox Code Playgroud)

并由 Tomcat servlet 提供服务。

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

在此处输入图片说明

这意味着https://example.com/dev/users/daily将从 代理http://localhost:8080/users/daily,并将https://example.com/prod/users/dailyhttp://localhost:8082/users/daily.

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

如何在具有工作内部链接的 Apache 中进行基于后缀的内部路由?

And*_*man 5

你可以这样做

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

等等。这将为不同的 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>
Run Code Online (Sandbox Code Playgroud)

等等。