使用不同的转发代理重写Apache请求

6
我想基于请求头在Apache中将请求转发到不同的转发代理。我认为最好使用mod_rewrite,但它只能使用在同一Apache配置中定义的反向代理。
我还检查了mod_proxy的ProxyRemote属性,但它不能基于条件使用,只能基于请求URL使用。
我需要类似这样的东西:
如果X-CUSTOM-HEADER是value-1 -> 将请求转发到转发代理p1 如果X-CUSTOM-HEADER是value-2 -> 将请求转发到转发代理p2
等等。
有人成功实现过类似这样的吗?
谢谢, Alin

我遇到了类似的问题。我也需要一个前向请求而不是反向请求,因为服务器本身并不持有资源,而应该从互联网上获取它们。你已经想出解决方案了吗? - The Surrican
这个要求最终被取消了,所以我没有机会在生产环境中测试解决方案。 - Alin
3个回答

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

你需要将URL调整为第二个服务器的子域名,然后再将其剥离。
这部分内容需要在第二个(远程代理服务器)上执行:
<ProxyMatch "http://.*\.[0-9]+\.server\.yourdomain\.com/.*">
    RewriteEngine on
    RewriteRule (proxy:http[s]?://.+)\.[0-9]+\.server\.premiumize\.me(.+) $1$2 
    ... your code ...
</ProxyMatch>

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]

0

你可以通过使用 RewriteCond 指令并验证 %{HTTP:header} 来实现它。

尝试以下操作:

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

希望能有所帮助。:)

这段代码很优雅,但是提问者明确表示他需要一个正向代理请求。因此,服务器p1和p2应该从外部第三方源获取资源,而不是直接从它们本身获取。 - The Surrican

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接