如何配置Apache .htaccess使附加域名的子域名/目录返回404
问题原因
你现有规则的核心问题是RewriteCond的逻辑组合错误:mod_rewrite默认同一规则下的多个条件为「与」关系,添加[OR]标记后会将相邻条件改为「或」关系,你把子域名拦截、主域路径拦截两类场景的条件混排后,逻辑完全偏离预期,会出现误拦截、漏拦截的情况。
正确配置方案
将原有规则替换为如下内容即可,将两类拦截逻辑拆分为独立规则,避免条件冲突:
# 开启重写引擎、主域跳转www RewriteEngine on RewriteCond %{HTTP_HOST} ^primary-domain\.com$ [NC] RewriteRule ^(.*)$ https://www.primary-domain.com/$1 [R=301,L] # 拦截两个附加域名对应子域名的所有访问 RewriteCond %{HTTP_HOST} ^(addon-domain-1|addon-domain-2)\.primary-domain\.com$ [NC] RewriteRule ^ - [R=404,L] # 拦截主域名(含www)下访问附加域名目录的请求 RewriteCond %{HTTP_HOST} ^(www\.)?primary-domain\.com$ [NC] RewriteRule ^(addon-domain-1|addon-domain-2)(/|$) - [R=404,NC,L]
改动说明
- 所有域名匹配规则增加结束符
$,避免匹配到非预期的相似域名 - 给主域301跳转规则补充
L标记,命中跳转后终止后续规则执行,避免多余匹配 - 子域名拦截独立为单条规则:只要访问的是两个附加子域,无论请求什么路径都直接返回404
- 主域路径拦截独立为单条规则:仅当访问域名为官方主域(含www)时,才检查请求路径是否命中两个附加目录,命中则返回404
- 路径匹配正则
(addon-domain-1|addon-domain-2)(/|$)可以同时覆盖两种访问形式:不带末尾斜杠的目录根访问(如primary-domain.com/addon-domain-1)、目录下的所有子路径访问(如primary-domain.com/addon-domain-1/test.html),不会漏拦截
测试注意:301跳转存在浏览器强缓存,修改配置后请用无痕模式或者curl命令测试,避免缓存导致结果不准。
内容的提问来源于stack exchange,提问作者Kyle Horkley
相关产品推荐
相关产品推荐

