【问题标题】:Apache config If statement with OS environment variable带有操作系统环境变量的 Apache config If 语句
【发布时间】:2021-08-07 01:07:43
【问题描述】:

如何根据操作系统级别的环境变量有条件地设置代理(printenv 将包含类似 ENV=qa、ENV=prod 等内容)?像这样的:

<If "${ENV} == 'qa'">
  ProxyPass "/" "www.google-qa.com"
</If>
<If "${ENV} == 'prod'">
  ProxyPass "/" "www.google-production.com"
</If>

有了类似上面的内容,我得到:Cannot parse condition clause: Parse error near '$'

【问题讨论】:

    标签: apache apache2.4


    【解决方案1】:

    两种替代语法可以代替:

    &lt;If "'${ENV}' == 'qa'"&gt;

    或

    &lt;If "reqenv('ENV') == 'qa'"&gt;

    但是 ProxyPass 不能封装在 &lt;If&gt; 中,主要是因为这是针对每个请求的检查,并且会在处理的后期发生,然后在 ProxyPass 必须执行时发生。

    通过 mod_rewrite 进行代理并在 RewriteCond 中检查 %{ENV:ENV} 可能更简单

    RewriteEngine on
    RewriteCond %{ENV:ENV} =qa
    RewriteRule ^/(.*) http://www.google-qa.com/$1 [P]
    RewriteCond %{ENV:ENV} =prod
    RewriteRule ^/(.*) http://www.google-production.com/$1 [P]
    

    【讨论】:

    • 谢谢!上面的例子不完全是我所拥有的,与我实际拥有的东西等效的重写是什么? ProxyPass "/api/" "balancer://appcluster/api/"、ProxyPassReverse "/api/" "balancer:/appcluster/api/" 和 BalancerMember "https://example.net:443"。我不需要平衡器的东西
    • 我之前完全错过了[P],现在只是编辑了。我认为您需要定义两个平衡器,而不仅仅是插入 balancer:// URL 来代替带有 P 标志的直接 URL
    猜你喜欢
    • 2018-12-13
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多