17

伙计们,我们正在尝试为以下场景设置 Apache 反向代理:

  • 传入请求采用以下形式http://foo.com/APP/v1/main.html
  • 对于某些服务器,URL 将引用不同的版本,例如,http://foo.com/APP/v2/main.html
  • 上游负载均衡器(HAProxy)会将请求发送到正确的服务器,该服务器将有一个面向 JBoss 服务器的 Apache2 反向代理。
  • 当请求出现在 Apache 2 时,它将具有类似的请求路径/APP/v1/main.html
  • 我们希望它(反向)代理到http://localhost:8080/AppContext/main.html而不考虑URL 中的版本片段(v1、v2 等)。

我一直在尝试这样做:

ProxyPassMatch ^/.*?/APP.*?/(.*)$ http://localhost:8080/AppContext/$1
ProxyPassReverse /APP http://localhost:8080/AppContext

我的问题是:

  1. 我的用法ProxyPassMatch正确吗?
  2. ProxyPassReverse的是“静态的”。我如何让它知道之后的潜在变量/APP

感谢您的任何见解。

-拉吉

4

1 回答 1

10

你已经接近了,试着稍微改变一下正则表达式来解释版本片段:

ProxyPassMatch ^/.*?/APP.*?/v[0-9]+/(.*)$ http://localhost:8080/AppContext/$1

ProxyPassReverse主要是为了确保在代理应用程序给出的响应中即时重写位置标头字段。因此,当它返回一个 301 重定向时,例如http://localhost:8080/AppContext/something,apache 知道将其更改为,/APP/v1/something因此代理后面的信息不会被暴露。因为您在反向代理中使用了动态 URL,所以这里有几个选择。您可以将其发送到 HAProxy 负载平衡器(不确定适合您的位置),或者您可以选择一个并希望获得最好的结果。例如,如果您有一个负载均衡器/APP/balancer/,然后将请求发送到/APP/v1//APP/v2//APP/v3/等。那么您可以这样做:

ProxyPassReverse /APP/balancer http://localhost:8080/AppContext

否则,您可以将其指向一个并希望最好:

ProxyPassReverse /APP/v1 http://localhost:8080/AppContext
于 2012-08-07T19:04:11.393 回答