apache – 如何在httpd.conf中使用mod_rewrite的环境变量进行插入proxypass

我正在使用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指令中使用环境变量的任何想法?

最佳答案 事实证明,即使有警告,Apache仍然会加载并正常工作,使用以下语法:

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

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

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

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

点赞