Apache VirtualHost中基于反向DNS notation动态设置DocumentRoot方案问询
配置实现方案
该需求可以实现,单独使用mod_vhost_alias无法适配任意层级域名的无冗余拼接,我们可以通过mod_vhost_alias搭配mod_rewrite处理冗余字符的方案实现,兼容性强且无需调用外部脚本,最多可支持预设的域名层级(以下示例默认支持最多8层域名,覆盖绝大多数使用场景)。
前置要求
确保Apache已经启用以下两个模块:
mod_vhost_aliasmod_rewrite
完整配置示例
<VirtualHost *:80> UseCanonicalName Off # 按最大支持8层域名拼接反向DNS路径,不存在的域名段自动返回空值 VirtualDocumentRoot "/domains/%-1.0.%-2.0.%-3.0.%-4.0.%-5.0.%-6.0.%-7.0.%-8.0/public" RewriteEngine On # 替换路径中连续出现的多个点为单个点 RewriteCond %{DOCUMENT_ROOT} ^(.*?)\.{2,}(.*)$ RewriteRule ^(.*)$ %1.%2/$1 [L] # 清理路径末尾多余的点 RewriteCond %{DOCUMENT_ROOT} ^(.*)\.(/.*)$ RewriteRule ^(.*)$ %1%2/$1 [L] <Directory /domains> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
配置说明
- 拼接路径时超出实际域名层级的占位符会返回空值,仅会产生多余的点字符,不会出现无效内容
- 两条重写规则会自动处理冗余的点字符,最终生成符合要求的路径:例如
admin.example.com初始拼接得到com.example.admin....../public,处理后会变为com.example.admin/public,myshop.net初始拼接得到net.myshop....../public,处理后变为net.myshop/public,完全匹配需求 - 如果需要支持超过8层的域名,仅需要在
VirtualDocumentRoot的拼接规则中增加%-N.0格式的占位符即可,不会影响少层级域名的解析 - 如需支持HTTPS,将上述配置复制到443端口的VirtualHost中,补充对应SSL证书配置即可正常使用
内容的提问来源于stack exchange,提问作者Leander Hass
相关产品推荐
相关产品推荐

