如何解决带有通配符子域的反向代理
我们的反向代理需要一个 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=www
将SUBDOMAIN
环境变量设置为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 举报,一经查实,本站将立刻删除。