如果我使用mod_rewrite,是否需要使用ProxyPassReverse?

时间:2011-11-15 14:27:51

标签: apache mod-rewrite mod-proxy

我使用mod重写来掩盖我的应用程序的上下文根。例如,

RewriteRule ^/directory/(.*) balancer://appcluster/directory/$1 [P]

appcluster看起来像这样:

<Proxy balancer://appcluster>
BalancerMember http://localhost:8080/App route=app_01 keepalive=On loadfactor=1 ttl=300 min=3 smax=5 max=15

ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On
</Proxy>

我是否需要使用ProxyPassReverse?我曾经使用它,因为我的旧网络服务器代码看起来像这样:

ProxyPass /App balancer://appcluster lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On

ProxyPassReverse /App http://localhost:9013/App

1 个答案:

答案 0 :(得分:49)

在Apache将浏览器发送给Apache之前,ProxyPassReverse用于将应用程序(appcluster)发送的标头更改为Apache。例如,如果应用位于http://localhost:9013/,并且它尝试将浏览器重定向到/new_location/,那么它将使用http://localhost:9013/new_location/和Apache的重定向和位置标头进行响应将采取此并将其发送到浏览器。问题是,浏览器(假设它在其他地方)然后尝试向http://localhost:9013/new_location/发送请求,并获得错误。

ProxyPassReverse所做的是拦截这些标头,并重写它们,使它们与正在进行代理的Apache服务器相匹配。因此,如果我的apache服务器正在托管http://myhost.com/并且我有ProxyPass/指向http://localhost:9013/App,那么位于localhost:9013的应用程序会返回重定向到{{3}我需要使用ProxyPassReverse,以便在将请求发送回浏览器之前由Apache重写为http://localhost:9013/App/new_location/

如果您不发布重定向,则不会出现问题,但如果返回301/302重定向,则将其存在并不会有任何问题。就mod_rewrite而言,RewriteRule适用于发往App的请求,而不适用于来自App的响应。所以他们是相互排斥的事件。