ProxyPassMatch与ProxyPassReverse

时间:2012-08-07 18:50:38

标签: apache reverse-proxy proxypass

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

  • 传入请求采用http://foo.com/APP/v1/main.html
  • 形式
  • 对于某些服务器,该网址会引用差异版本,例如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之后让它了解潜在的可变内容?
  3. 感谢您的任何见解。

    -Raj

1 个答案:

答案 0 :(得分:9)

您已经关闭,请尝试稍微更改正则表达式以考虑版本片段:

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