apache2下mod_rewrite非硬编码移除域名末尾固定后缀的咨询
非硬编码剥离域名固定后缀的Apache2 mod_rewrite配置实现
前置模块准备
需要确保Apache加载以下核心模块,未加载的可在主配置中启用后重启服务:
mod_rewrite:提供URL重写能力mod_proxy、mod_proxy_http:提供反向代理能力mod_headers:支持请求头自定义修改
核心配置逻辑
完全通过正则动态匹配Host名,无需预先硬编码任意前缀:
- 对传入请求的Host头做正则匹配,识别末尾为固定后缀
.dev.example.com的请求,将后缀前的全部主机前缀捕获为动态变量 - 替换请求头中的Host值为捕获到的无后缀主机名
- 将完整请求路径、查询参数透传,代理到替换后的目标主机
完整配置示例
直接写入对应SSL/HTTP虚拟主机配置段即可:
<VirtualHost *:443> # 原有SSL证书配置保持不变 SSLEngine on SSLCertificateFile /your/path/cert.pem SSLCertificateKeyFile /your/path/private.key # 开启重写引擎 RewriteEngine On # 匹配Host末尾固定的.dev.example.com后缀,捕获前缀为动态变量(正则中所有点号必须转义) RewriteCond %{HTTP_HOST} ^(.+)\.dev\.example\.com$ [NC] # 替换请求头中的Host为捕获到的无后缀主机名 RequestHeader set Host "%1" # 所有请求按捕获的主机名做代理,路径、查询参数保持原样 RewriteRule ^/(.*)$ https://%1/$1 [P,L,QSA] # 保留修改后的Host头透传给后端服务 ProxyPreserveHost On </VirtualHost>
关键注意点
- 正则表达式中的
.dev.example.com所有点号必须加反斜杠转义,否则会被视为通用通配符,导致非预期的域名被匹配 - 规则末尾的标记不能遗漏:
[NC]:忽略Host名的大小写差异,适配域名不区分大小写的特性[P]:标记规则走反向代理逻辑,避免误触发302重定向[L]:匹配成功后终止后续规则执行,避免重复处理[QSA]:自动拼接原请求携带的查询参数,不会丢失GET请求参数
- 该配置完全动态适配所有带固定后缀的Host,无需提前枚举可能的主机前缀,满足无法硬编码目标域名的需求
- 正则采用贪婪匹配模式,哪怕主机名本身嵌套了该固定后缀,也只会剥离最末尾的匹配段;同时正则要求固定后缀前至少有一段内容,不会把纯
dev.example.com的主机名误处理为空值,避免出现代理错误 - 如果原本就无
.dev.example.com后缀的Host请求命中该虚拟主机,不会触发重写逻辑,可根据业务需要补充对应的兜底处理规则
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

