如何使用 Apache 中的代理模块重定向 URL?

如何使用 Apache 中的代理模块重定向 URL?

这似乎是一个非常基本的问题,但我很难找到一个简单的解决方案,因此非常感谢大家在这个问题上的帮助和耐心:

我想配置我的 Apache 代理服务器来重定向某些 URL,这样,例如,Web 浏览器对 www.olddomain.com 的 HTTP 请求将传递到代理服务器,然后代理服务器将请求路由到 www.newdomain.com,代理服务器将响应发送到代理服务器,然后代理服务器将其传回 Web 浏览器。

看起来很简单,但我不知道如何在 Apache 上实现这一点。我知道 Squid/Squirm 提供了此功能,所以我猜我遗漏了一些非常基本的东西。我知道我可以使用 RewriteRule 动态修改 URL 并将其传递给代理服务器,但我实际上想做相反的事情,即代理服务器接收原始 URL,应用 RewriteRule,然后将 HTTP 请求转发到新 URL。

希望这有意义。提前感谢任何帮助。

答案1

从您对我之前的回答的评论中,我了解到您正在使用 Apache 作为转发代理 ( ProxyRequests On)。您可以使用mod_rewrite代理传递特定的 URL。

您的 Apache 配置中可能会出现类似这样的内容:

ProxyRequests On
ProxyVia On
<Proxy *>
   Order deny,allow
   Allow from xx.xx.xx.xx
</Proxy>

然后,您必须添加以下内容以便代理传递从www.olddomain.com/foo到的所有请求www.newdomain.com/bar

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.olddomain\.com$
RewriteRule /foo(.*)$ http://www.newdomain.com/bar/$1 [P,L]

这样做的目的是:

  • 当向主机发出请求时www.olddomain.comRewriteRule将会触发。
  • 该规则替代/foohttp://www.newdomain.com/bar/
  • 替换交给mod_proxyP)。
  • 停止重写(L)。

示例结果:

  • 浏览器配置为使用您的 Apache 作为代理服务器。
  • 它请求www.olddomain.com/foo/test.html
  • 您的 Apache 将把它重写为www.newdomain.com/bar/test.html
  • 它将向负责的 Web 服务器请求此页面。
  • 将结果作为 返回给浏览器www.olddomain.com/foo/test.html

答案2

如果我理解正确的话,你可能想看看:mod_proxy与基于名称的虚拟主机结合

下面是一个小例子。所有来自 www.olddomain.com 虚拟主机的请求都将从 www.newdomain.com 发出,并由 apache 重写:

NameVirtualHost *:80
<VirtualHost *:80>
     ServerName www.olddomain.com

     <Proxy *>
            Order deny,allow
            Allow from all
     </Proxy>
     ProxyPass / http://www.newdomain.com/
     ProxyPassReverse / http://www.newdomain.com/
     ProxyPassReverseCookieDomain www.newdomain.com www.olddomain.com 
</VirtualHost>

相关内容