apache - 带有通配符子域的反向代理
问题描述
我们的反向代理需要一个 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 指令中使用环境变量(请参阅文档)。 - 该表达式
SetEnvIf Host "^([^.]*).example.com$" SUBDOMAIN=$1
获取主机名的子域部分,将其保存到 变量中$1
并将其分配给变量SUBDOMAIN
。 - 如果不存在子域(如在http://example.com中),则表达式
SetEnvIf Host "^example.com$" SUBDOMAIN=www
将SUBDOMAIN
环境变量设置为。www
- ProxyPass 和 ProxyPassReverse 指令中的参数
interpolate
允许它们使用${SUBDOMAIN}
环境变量。
因此:
any.example.com
被发送到any.server.local
,并且
example.com
被发送到www.server.local
此外,我们还配置了内部和外部 DNS,以便将任何请求*.example.com
分别发送到内部和外部反向代理地址。对于 SSL,我们设置了 Let's Encrypt ( *.example.com
)的通配符证书
我们希望这可以帮助任何需要类似配置的人。
解决方案
推荐阅读
- django - 是否可以对 Django 模型方法 (validate_unique) 进行 doctest
- javascript - 如何选择所有具有图像子项的链接
- c - 用句号结束程序
- python - 如何在 XSD 限制中允许换行?
- python - pandas idxmax(idxmin) 方法与 pd.NaT 的行为不一致
- r - stat_sum 中点之间的填充
- html - 使用 jquery 删除
但保留行
- reactjs - 结合两个单独的状态对象以在 React js 中发送到后端
- python-3.x - 在 anaconda 环境中安装自己的包
- python - 在 numpy 数组中找到连续索引的中断