不确定这是否是发布此内容的正确 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 的存在,而只知道代理服务器的存在。
- 这里发生了什么?
- 这难道不是 mod_proxy 的设计目的吗?
- 我还应该用别的东西来代替吗?
答案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
。
- 这难道不是 mod_proxy 的设计目的吗?
当然。它确实在执行您要求它执行的操作...它从http://google.ca
客户端获取内容并逐字返回。
- 我还应该用别的东西来代替吗?
如果你真的想在特定的 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
但不清楚您要完成什么目标。