ProxyPassMatch与ProxyPassReverse

Raj*_*Raj 16 apache reverse-proxy proxypass

伙计们,我们正在尝试为以下场景设置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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我使用ProxyPassMatch正确吗?
  2. ProxyPassReverse是"静态的".如何让它意识到之后可能变化的东西/APP

感谢您的任何见解.

-Raj

Jon*_*Lin 9

你很接近,尝试稍微更改正则表达式以考虑版本片段:

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

ProxyPassReverse大多以确保即时在被代理的应用程序提供的响应位置标头字段的改写.因此,当它返回301重定向时,例如,http://localhost:8080/AppContext/somethingapache知道将其更改为,/APP/v1/something因此代理背后的信息不会暴露.因为您在反向代理中使用了动态URL,所以此处有一些选择.您可以将它发送到HAProxy负载均衡器(不确定它在哪里),或者您可以选择一个并希望获得最佳效果.举例来说,如果你有一个负载平衡器/APP/balancer/,然后将请求发送到/APP/v1/,/APP/v2/,/APP/v3/,等等,那么你可以这样做:

ProxyPassReverse /APP/balancer http://localhost:8080/AppContext
Run Code Online (Sandbox Code Playgroud)

否则,您可以将其指向一个并希望获得最佳效果:

ProxyPassReverse /APP/v1 http://localhost:8080/AppContext
Run Code Online (Sandbox Code Playgroud)