如果我使用 mod rewrite,是不是需要使用 ProxyPassReverse?

Posted

技术标签:

【中文标题】如果我使用 mod rewrite,是不是需要使用 ProxyPassReverse?【英文标题】:Do I need to use ProxyPassReverse if I'm using mod rewrite?如果我使用 mod rewrite,是否需要使用 ProxyPassReverse? 【发布时间】:2011-12-29 14:04:59 【问题描述】:

我正在使用 mod rewrite 来屏蔽我的应用程序的上下文根。例如,

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

应用集群如下所示:

<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】:

ProxyPassReverse 用于在 Apache 将其发送到浏览器之前更改应用程序 (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 的应用程序返回重定向到 http://localhost:9013/App/new_location/,我将需要使用 @ 987654335@ 以便 Apache 在将请求发送回浏览器之前将其重写为 http://myhost.com/new_location/。

如果您不发出重定向,这不会成为问题,但如果返回 301/302 重定向,将它放在那里并没有什么坏处。至于 mod_rewrite,RewriteRule 适用于发往 App 的请求,而不是来自 App 的响应。所以它们是相互排斥的事件。

【讨论】:

那么我的代理传递反向是以下内容:ProxyPassReverse /App/directory localhost:9013/App/directory ? 我认为你所拥有的是正确的。虽然我见过人们以这样的方式使用它,其中右侧的 url 是外部域而不是 localhost。我的 Jboss 部署使用 ProxyPassReverse 就像你拥有它一样,它们重定向就好了。 关于 ProxyPassReverse 及其需求的非常好的解释。 @jon lin .. 谢谢 我想在浏览器中保留 url,下面的所有 example.xyz/us/en/search 都应该代理到 example.us/us/en/search。我有以下规则。 ProxyPassMatch "^/(.2,3)/(.2,3)/(.*)/?$" "example.$1/$1/$2/$3" ProxyPassReverse "^/(.*)$" "example.xyz/$1"除了 404 之外,url 正在更改为 example.us/us/en/search。

以上是关于如果我使用 mod rewrite,是不是需要使用 ProxyPassReverse?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_rewrite 来修改 Confluence 6 的 URLs

使用 mod_rewrite 来修改 Confluence 6 的 URLs

ifModule mod_rewrite 标记在 .htaccess mod_rewrite 文件中是不是多余

mod_rewrite,重定向并设置cookie,防止重定向循环

如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消

需要澄清 mod_rewrite 问题