配置全局Rewrite规则:仅根目录请求时重定向子域名
解决方案
以下是符合你需求的全局Rewrite规则,既能实现仅根目录触发重定向,适配所有域名层级,同时确保mta-sts子域名下的必要文件可正常访问:
RewriteEngine On # 排除mta-sts子域名下的非根目录请求(允许访问必要配置文件) RewriteCond %{HTTP_HOST} ^mta-sts\.(.+)$ [NC] RewriteCond %{REQUEST_URI} !^/?$ RewriteRule ^ - [L] # 仅根目录请求时,移除开头的www/mail/mta-sts前缀并重定向 RewriteCond %{HTTP_HOST} ^(www|mail|mta-sts)\.(.+)$ [NC] RewriteCond %{REQUEST_URI} ^/?$ RewriteRule ^ %{REQUEST_SCHEME}://%2/ [L,R=301]
规则说明
- 仅根目录触发:通过
RewriteCond %{REQUEST_URI} ^/?$限定只有访问/(或空路径,兼容不同Apache配置逻辑)时才执行重定向,非根目录请求不会被处理。 - 适配所有域名层级:用
^(www|mail|mta-sts)\.(.+)$正则匹配,不管是www.domain.tld、www.sub.domain.tld还是mail.sub.sub.domain.tld,都能精准捕获去掉前缀后的完整域名到%2变量,无需针对不同层级单独写规则。 - mta-sts特殊处理:优先添加例外规则,当请求mta-sts子域名的非根目录路径时,直接跳过后续重定向逻辑,确保
mta-sts.domain.tld/.well-known/mta-sts.txt这类邮件服务必要文件可正常访问。 - 自动适配协议:用
%{REQUEST_SCHEME}自动使用请求的HTTP/HTTPS协议,避免硬写协议导致的混合内容问题。
你现有规则的问题
- 匹配范围过宽:你的
RewriteRule ^/?(.*)$会匹配所有请求路径,导致非根目录的页面也被错误重定向,这是无法限定仅根目录触发的核心原因。 - 域名层级限制:分两层、三层域名的写法通用性差,遇到四层及以上子域名时规则会直接失效。
- mta-sts无例外处理:没有针对mta-sts子域名的文件请求做排除,会导致该子域名下的必要配置文件被重定向,影响邮件服务的MTA-STS功能正常运行。
注意事项
- 在cPanel中,全局规则需要放在全局Apache配置的Rewrite区域,比如
/etc/apache2/conf.d/includes/pre_virtualhost_global.conf(具体路径可参考cPanel全局配置文档),新增域名时会自动继承该规则,无需重复配置。 - 测试前请清空浏览器缓存,因为301是永久重定向,浏览器会缓存旧的重定向记录,影响测试结果。
内容的提问来源于stack exchange,提问作者Snape Ninja
相关产品推荐
相关产品推荐

