2010-03-16 55 views
6

我想根据请求头在Apache中将请求转发到不同的转发代理。我认为最好的方式是使用mod_rewrite,但它只能使用在同一个apache配置中定义的反向代理。使用不同的转发代理的Apache重写请求

我也检查了mod_proxy的ProxyRemote属性,但它不能根据条件使用,只能根据请求url的使用。

我需要这样的东西:

如果X-CUSTOM-头是价值1 - 转发代理P2>转发请求 - 转发代理P1 如果X-CUSTOM-头是价值2>转发请求

任何人都设法做出类似的东西?

感谢, 阿林

+0

我面临着类似的问题。我还需要一个转发请求,而不是一个反向请求,因为服务器本身不占用资源,但应从互联网上获取它们。你有没有想出一个解决方案呢? – 2011-09-04 12:34:46

+0

这个要求毕竟被删除了,所以我没有机会在生产中测试解决方案。 – Alin 2011-10-25 20:39:28

回答

2

我找到了一个解决方案,它不是很优雅。它也涉及到第二台服务器上的一些适应。

它来自一个项目,我有一个类似的问题,但需要服务器“完全”(由使用数据库资源的自定义脚本选择)。

这应该至少工作(我运行我的URL通过重写映射进行修改,我调整它使用标头使用RewriteCond)。

# example for server number "5" in your remote proxy network 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule http://([a-z0-9\.]+)/(.*) http://$1.5.server.yourdomain.com$1 [P] 
ProxyRemoteMatch .*\.5\.server\.yourdomain\.com.* http://5.server.yourdomain.com:80 

您基本上调整了网址,以便它是您的第二台服务器的子域,然后再将其删除。
这部分进入第二(远程代理服务器)上:

<ProxyMatch "http://.*\.[0-9]+\.server\.yourdomain\.com/.*"> 
    RewriteEngine on 
    RewriteRule (proxy:http[s]?://.+)\.[0-9]+\.server\.premiumize\.me(.+) $1$2 
    ... your code ... 
</ProxyMatch> 
0

你应该能够通过使用RewriteCond指令与验证%实现它{HTTP:头}。

尝试以下操作:

RewriteEngine On 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule (.*) http://p1.example.com$1 [P] 
ProxyPassReverse/http://p1.example.com 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
RewriteRule (.*) http://p2.example.com$1 [P] 
ProxyPassReverse/http://p2.example.com 

希望它能帮助。 :)

+0

这是优雅的,但提问者表示他需要转发代理请求。所以服务器p1和p2应该从外部第三方来源提供资源,而不是直接从他们那里提供资源。 – 2011-09-04 12:34:08

1

试试这个:

# Prevents Apache from functioning as a forward proxy server (where you don't want) 
ProxyRequests Off 
# Preserve Host in http protocol on destination server 
ProxyPreserveHost On 
<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 
# enable rewrite engine 
RewriteEngine On 
# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
# execute forward proxy 
RewriteRule (.*) http://server1/$1 [P,L,QSA] 

# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
# execute forward proxy 
RewriteRule (.*) http://server2/$1 [P,L,QSA]