.htaccess重定向:将subdomain.www.domain.com改写为subdomain.domain.com
嘿,这个需求其实挺典型的,我来给你拆解清楚怎么改,还有通用的规则写法:
一、修改现有Rewrite规则的关键部分
你的核心需求是把subdomain.www.domain.com这类域名重定向到subdomain.domain.com,本质是去掉域名中间多余的www.。
假设你现在的Rewrite规则是针对普通带www的域名(比如www.domain.com转domain.com),那你需要调整的是域名捕获的正则表达式部分:
- 原来的规则可能只匹配开头的
www.,现在要匹配[任意子域].www.这种结构,把[任意子域]单独捕获,再拼接成目标域名。
举个Apache的例子,假设你原来的规则是这样的:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
那你需要把RewriteCond里的正则改成能捕获www前面子域的写法,调整后:
# 匹配形如 xxx.www.domain.com 的域名,捕获xxx部分 RewriteCond %{HTTP_HOST} ^(.+)\.www\.domain\.com$ [NC] RewriteRule ^(.*)$ https://%1.domain.com/$1 [R=301,L]
这里的关键修改就是把原来的^www\.(.*)$换成^(.+)\.www\.domain\.com$,这样就能精准捕获www前面的子域部分,再通过%1调用这个捕获组拼成目标域名。
二、捕获所有子域名的通用Rewrite规则
如果要适配所有可能的子域(包括多级子域,比如a.b.www.domain.com转a.b.domain.com),下面分Apache和Nginx两种主流服务器给你通用规则:
Apache 通用规则
# 先开启Rewrite引擎(如果没开的话) RewriteEngine On # 匹配所有包含 .www. 的二级/多级子域,捕获www前面的全部内容 RewriteCond %{HTTP_HOST} ^(.+)\.www\.domain\.com$ [NC] # 301永久重定向到去掉www的对应域名,L表示这是最后一条规则 RewriteRule ^(.*)$ https://%1.domain.com/$1 [R=301,L]
这里的(.+)会捕获www前面的所有内容(不管是单级还是多级子域),%1就是这个捕获的内容,完美适配所有子域场景。
Nginx 通用规则
你可以单独写一个server块来处理这类请求:
server { listen 80; listen 443 ssl; # 正则匹配所有 xxx.www.domain.com 格式的域名 server_name ~^(.+)\.www\.domain\.com$; # 永久重定向到去掉www的域名,保留原请求路径和参数 return 301 https://$1.domain.com$request_uri; }
或者在现有server块里添加判断逻辑:
if ($host ~* ^(.+)\.www\.domain\.com$) { return 301 https://$1.domain.com$request_uri; }
额外注意点
- 优先用
301永久重定向,这对SEO友好,浏览器也会缓存重定向规则;测试阶段可以先用302临时重定向,确认没问题再改成301。 - 要确保你的服务器已经配置了目标域名(比如
subdomain.domain.com)的站点,不然重定向后会出现404错误。 - 如果是HTTPS请求,一定要保证目标域名有有效的SSL证书,否则会触发浏览器安全警告。
内容的提问来源于stack exchange,提问作者PHPDev
相关产品推荐
相关产品推荐

