如何在httpd.conf中使用mod_rewrite的环境变量进行插值代理

时间:2013-10-29 21:25:51

标签: apache mod-rewrite httpd.conf mod-proxy

我正在使用apache 2.4并尝试在conf文件中使用环境变量进行代理传递。有一个线程[Apache proxypass using a variable URL with interpolate]正在谈论这个:

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 & proxypassreverse:
ProxyPassInterpolateEnv On
ProxyPass / ajp://${SERVER_NAME}:8009/ interpolate
ProxyPassReverse / ajp://${SERVER_NAME}:8009/ interpolate

但是当我自己尝试这个时,我得到一个“AH00111:Config变量$ {SERVER_NAME}未定义”错误。这意味着Apache2.4将$ {SERVER_NAME}视为配置变量,而不是环境变量。

我也尝试使用mod_rewrite sytax作为变量,像这样,

ProxyPass / ajp://%{ENV:SERVER_NAME}:8009/ interpolate
ProxyPassReverse / ajp://%{ENV:SERVER_NAME}:8009/ interpolate

但是%{ENV:SERVER_NAME}被视为明文字符串,并且因为它不是有效的URL传递而创建了错误。

配置变量在服务器启动时使用“定义”块定义。我想要的是让SERVER_NAME在运行时使用mod_rewrite进行更改。 我不能使用mod_rewrite [P]参数,因为我需要让ProxyPassReverse块也使用变量。 mod_rewrite无法处理重写响应,因此无法模仿ProxyPassReverse的功能。

有关如何在插入proxypass conf指令中使用环境变量的任何想法吗?

1 个答案:

答案 0 :(得分:2)

事实证明,即使有警告,Apache仍然会加载并正常运行,使用以下语法:

ProxyPassReverse / ajp://${SERVER_NAME}:8009/ interpolate

此问题已在this mailing list thread中确定。讨论是关于另一个问题,但是他们提到了这个问题,并讨论了向ProxyPass添加第二个插值语法等的想法。但是,我还没有找到错误报告,而且从Apache 2.4.10开始,{{{ 3}}仍然只支持${varname}语法,这与整个httpd.conf插值冲突。

我还没有找到一种方法来禁用这些特定的警告,但是如果你愿意接受这些警告,那么Apache应该仍然适合你。

有一点需要注意,如果在加载Apache时存在一个具有相同名称的系统环境变量,它将覆盖您在运行时尝试插入的值。