微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决带有通配符子域的反向代理

我们的反向代理需要一个 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 举报,一经查实,本站将立刻删除。