Apache proxypass 使用带插值的变量 URL

Posted

技术标签:

【中文标题】Apache proxypass 使用带插值的变量 URL【英文标题】:Apache proxypass using a variable URL with interpolate 【发布时间】:2011-06-02 18:21:46 【问题描述】:

我正在尝试设置一个 apache 服务器来进行测试。目标是模拟负载均衡器。我们试图模拟的部分只是接受客户端的安全 httprequest 并使用 proxypass 将其(通过不安全的 http)传递给正确的服务器。这一切都 100% 有效。

问题是这样的:我想在几个开发环境中使用这个“负载均衡器”。为了能够测试应用程序的服务器端,我希望 proxypass 使用变量 URL 传递给客户端 IP。这将需要在 proxypass 规则中使用变量 URL。我找到了变量 REMOTE_ADDR,但我似乎无法在 proxypass 规则中使用它。我首先尝试了 apache 网站告诉我使用的语法,但没有奏效(http://REMOTE_ADDR/foobar/ 的 DNS 查找失败)。我知道我必须对 Interpolate 做一些事情,但我似乎无法弄清楚那到底是什么。

这条线做了它应该做的,所以服务器工作得很好: 代理通行证/http://localhost:81/

这些是我尝试过的(使用变量)失败的规则。

ProxyPass / http://$REMOTE_ADDR:81/ 错误:[client 127.0.0.1] 代理:DNS 查找失败:$remote_addr 返回 /

ProxyPass / https://%REMOTE_ADDRs/ 错误:[client 127.0.0.1] 代理:DNS 查找失败:%remote_addrs 返回 /

ProxyPassInterpolateEnv 开启 ... ProxyPass / http://$REMOTE_ADDR:81/ 插值 错误:[client 127.0.0.1] 解析 URL 时出错 //:81: Invalid host/port

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

对于插值的情况,应该是这样的:

RewriteEngine on
RewriteMap lowercase int:tolower

#This sets the variable to env:
RewriteRule ^ - [E=SERVER_NAME:$lowercase:%SERVER_NAME]

#Now interpolate makes variables available for proxypass & proxypas-s-reverse:
ProxyPassInterpolateEnv On
ProxyPass / ajp://$SERVER_NAME:8009/ interpolate
ProxyPassReverse / ajp://$SERVER_NAME:8009/ interpolate

在网上搜索了一夜之后,我找不到像这样的明确案例或任何答案。不过,我终于想通了。

【讨论】:

我几乎尝试了所有方法,并在此过程中删除了“interpolate”关键字。它现在完美运行。谢谢。 apache 执行此操作的方式似乎发生了变化——它现在不喜欢 rewritemap 行,并且变量似乎没有设置【参考方案2】:

您可以将mod_rewrite规则的Proxypass指令替换为[P]代码,P表示代理。

Mod_rewrite 会让你做更具体的事情。

【讨论】:

这意味着类似:RewriteRule ^/ http://%REMOTE_ADDR:81/ 我正确吗? 是的,也许有 [P],但我的大脑不是 mod_rewrite 引擎,我不能确定 :-) 这种方式只能ProxyPass,不能ProxyPassReverse

以上是关于Apache proxypass 使用带插值的变量 URL的主要内容,如果未能解决你的问题,请参考以下文章

使用Weblogic的Apache 2.2 ProxyPass - 不能使用root

proxy_pass使用内置变量报错

使用多个 ProxyPass 配置 Apache

apache ProxyPass:如何保留原始IP地址

如何在 Apache 中将部分 URL 传递给 ProxyPass

Apache ProxyPass 负载平衡所有 URL