Apache Proxy Pass做了一个redirect,而不是像一个反向代理

不知道这是否是正确的堆栈交换发布此。 如果有更好的地方请redirect我 – 谢谢。

我在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 

我被redirect到:

 http://www.google.ca 

我预计,mod_proxy将像一个代理,而不是只是redirect到谷歌。 我希望我的浏览器不应该知道google.ca存在,应该只知道代理服务器的存在。

  1. 这里发生了什么?
  2. 这不是什么mod_proxydevise的?
  3. 还有别的东西我应该用吗?

  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> 

还有你的redirect。 Google在google.comgoogle.ca和其他人可能会这样做。

  1. 这不是什么mod_proxydevise的?

当然。 它正在按照您要求的方式执行…它从http://google.ca获取内容并逐字将其返回给客户端。

  1. 还有别的东西我应该用吗?

如果你真的想在一个特定的URL上像通用的正向代理一样行事,你可能需要调查mod_proxy_html ,它可以用来重写从远程服务器获取的内容中的链接。

但总的来说,防止远程站点执行这种redirect是非常困难的(因为即使重写Location标头, <A>标签和其他地方的链接,您可能会错过一些Javascript或其他东西)

mod_proxy实际上会重写HTTPredirect响应上的“位置”,“内容位置”和“URI”头。 正如谷歌解释说,301谷歌正在做的原因

 ProxyPassReverse /goo http://google.ca 

无效,因为redirect到www.google.ca不匹配。

你可以尝试添加

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

但目前还不清楚你正在努力完成什么。