Apache Proxy Pass 执行重定向,而不是充当反向代理

Apache Proxy Pass 执行重定向,而不是充当反向代理

不确定这是否是发布此内容的正确 Stack Exchange。如果有更好的地方,请重定向我 - 谢谢。

我在 httpd.conf 中启用了以下行:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so

然后我添加了以下几行:

ProxyRequests Off

<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass /goo http://google.ca
ProxyPassReverse /goo http://google.ca

如果我打开浏览器并访问以下 URL:

http://localhost/goo

我明白了重定向到:

http://www.google.ca

我期望 mod_proxy 能够充当代理,而不仅仅是重定向到 google。我期望我的浏览器不知道 google.ca 的存在,而只知道代理服务器的存在。

  1. 这里发生了什么?
  2. 这难道不是 mod_proxy 的设计目的吗?
  3. 我还应该用别的东西来代替吗?

答案1

  1. 这里发生了什么?

好吧,让我们看一下http://google.ca

$ curl -D /dev/stdout http://google.ca
HTTP/1.1 301 Moved Permanently
Location: http://www.google.ca/
.
.
.
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.ca/">here</A>.
</BODY></HTML>

这就是您的重定向。Google 会在 、 以及可能还有其他网站上执行此google.com操作google.ca

  1. 这难道不是 mod_proxy 的设计目的吗?

当然。它确实在执行您要求它执行的操作...它从http://google.ca客户端获取内容并逐字返回。

  1. 我还应该用别的东西来代替吗?

如果你真的想在特定的 URL 上充当通用转发代理,你可能需要调查mod_proxy_html,可用于重写从远程服务器获取的内容中的链接。

但一般来说,很难阻止远程站点执行这种重定向(因为即使你在标题Location<A>标签和其他地方重写链接,你也可能会错过一些 Javascript 或其他东西……)

答案2

mod_proxy 实际上会重写 HTTP 重定向响应中的“Location”、“Content-Location”和“URI”标头。正如 larsks 的回答中所解释的那样,google 所做的 301 操作会导致

ProxyPassReverse /goo http://google.ca

由于重定向到 www.google.ca 不匹配,因此无效。

您可以尝试添加

ProxyPassReverse /goo http://www.google.ca

但不清楚您要完成什么目标。

相关内容