.htaccess配置子域名通配301重定向 不影响主域名跳转规则
问题根因
你遇到的规则互串问题来自三个配置错误:
- 跨模块执行顺序冲突:你用
mod_alias模块的Redirect指令写主域名的/service跳转,用mod_rewrite模块写子域名跳转,Apache中不同模块的执行优先级不按配置文件里的书写顺序走,很容易出现子域名请求先被Redirect规则拦截的情况。 - 主域名跳转规则无Host校验:
Redirect指令会匹配所有域名下的对应路径,不管请求是来自主域名还是location子域名,只要路径是/service/就会触发跳转,这就是子域名下/service路径被错跳的核心原因。 - 子域名跳转规则本身有缺陷:一是跳转目标没带
https://协议头,会被Apache识别为当前域名下的相对路径,导致跳转地址错误;二是规则拼接了原请求URI,会把/service这类路径带到跳转后的地址里,不符合你所有子域名页面统一跳转到新域名/location首页的需求。
正确配置
把所有重定向规则统一用mod_rewrite实现,严格按「先子域名规则、后主域名规则」的顺序书写,利用L标志实现匹配即终止,避免规则互串,完整配置如下:
RewriteEngine On # 处理location子域名的所有请求:任意路径都301跳转到新域名/location页面 RewriteCond %{HTTP_HOST} ^location\.example\.com$ [NC] RewriteRule ^ https://new-example.com/location [R=301,NC,L,QSA] # 保留主域名原有的/service路径跳转逻辑,仅主域名请求会触发该规则 RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] RewriteRule ^service/?$ https://new-example.com/service [R=301,NC,L,QSA]
配置前请把原来写的
Redirect 301 /service/ https://new-example.com/service这行规则删掉,避免冲突。
配置说明
- 所有规则统一走mod_rewrite模块,执行顺序完全按配置文件的书写顺序从上到下匹配,彻底解决跨模块优先级混乱的问题
- 子域名规则放在最顶部,只要请求的Host是
location.example.com,不管访问的是根路径、/service还是其他任意子路径,都会直接跳转到指定的新地址,匹配后通过L标志终止后续所有规则执行,完全不会触碰到主域名的跳转逻辑 - 主域名的/service规则新增了Host校验,只有请求来自主域名(默认兼容带www和不带www两种形式,不需要可以自行删掉
(www\.)?部分)时才会触发跳转,完全保留你原有的主域名重定向逻辑 - 子域名跳转不再拼接原请求URI,所有子域名下的页面都会统一跳转到新域名的/location首页,符合你的迁移预期
- 规则修改完成后,请先清空浏览器的301重定向缓存再做测试,之前错误跳转产生的持久化缓存会影响验证结果。
内容的提问来源于stack exchange,提问作者Carabao Coder
相关产品推荐
相关产品推荐

