带有通配符子域的反向代理

问题描述

我们的反向代理需要一个 Apache 配置,以允许将任何子域 (any.example.com) 重定向到保留子域 (any.server.local) 的上游服务器。

我们发现 RewriteRules 指令有几个死胡同,而且没有可用的现成配方。

最终,我们想出了一个解决方案:

<VirtualHost example.com:443>
    #any other directives you usually use
        ProxyPassInterpolateEnv On
        SetEnvIf Host "^([^.]*).example.com$" SUBDOMAIN=$1
        SetEnvIf Host "^example.com$" SUBDOMAIN=www
        ProxyPass /  http://${SUBDOMAIN}.server.local/ interpolate
        ProxyPassReverse /  http://${SUBDOMAIN}.server.local/ interpolate
        ServerName example.com
        ServerAlias *.example.com
</VirtualHost>
  • 表达式 ProxyPassInterpolateEnv On 允许您在 ProxyPass 和 ProxyPassReverse 指令中使用环境变量(请参阅 documentation)。
  • 表达式 SetEnvIf Host "^([^.]*).example.com$" SUBDOMAIN=$1 获取主机名的子域部分,将其保存到 $1 中并将其分配给变量 SUBDOMAIN
  • 表达式 SetEnvIf Host "^example.com$" SUBDOMAIN=wwwSUBDOMAIN 环境变量设置为 www,如果不存在子域(如在 http://example.com 中)。
  • ProxyPass 和 ProxyPassReverse 指令中的参数 interpolate 允许它们使用 ${SUBDOMAIN} 环境变量。

因此:

any.example.com 被发送到 any.server.local,并且

example.com 被发送到 www.server.local

此外,我们还配置了内部和外部 DNS,以便对 *.example.com 的任何请求都将分别发送到内部和外部反向代理地址。 对于 SSL,我们设置了来自 Let's Encrypt (*.example.com)

通配符证书

我们希望这能帮助任何需要类似配置的人。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)