如何用.htaccess实现主域名非www转www、子域名www转非www(不硬编码域名)
使用.htaccess实现无硬编码域名的跳转规则
以下是满足需求的.htaccess规则,全程不硬编码具体域名,适配所有主域名和子域名场景:
# 启用重写引擎 RewriteEngine On # 规则1:将子域名的www形式(如www.en.domain.com)重定向至非www形式(en.domain.com) RewriteCond %{HTTP_HOST} ^www\.(.*\..*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 规则2:将主域名的非www形式(如domain.com)重定向至www形式(www.domain.com) RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
规则细节解释:
- 启用重写引擎:
RewriteEngine On是Apache mod_rewrite模块生效的基础,必须放在规则最开头。 - 子域名www转非www:
RewriteCond %{HTTP_HOST} ^www\.(.*\..*)$ [NC]:匹配所有以www.开头且包含至少两个点的多级子域名,%1会捕获www.之后的完整子域名部分(比如en.domain.com),[NC]表示不区分大小写。RewriteRule ^(.*)$ https://%1/$1 [R=301,L]:将请求重定向到捕获到的子域名,保留原请求路径;R=301是永久重定向(利于搜索引擎优化),L表示匹配后不再执行后续规则。
- 主域名非www转www:
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]:仅匹配只有一个点的主域名(比如domain.com),避免干扰多级子域名。RewriteCond %{HTTP_HOST} !^www\. [NC]:排除已经是www开头的主域名,防止出现循环跳转。RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]:在原主域名前添加www.前缀,保留原请求路径,同样使用301永久重定向。
实操注意事项:
- 确保服务器已启用
mod_rewrite模块,Apache服务器通常需要在httpd.conf中开启该模块。 - 测试阶段可以先用
R=302临时重定向,确认规则生效后再切换为R=301永久重定向。 - 规则顺序不能颠倒,必须先处理子域名跳转,否则主域名规则可能错误匹配子域名场景。
内容的提问来源于stack exchange,提问作者Moktar
相关产品推荐
相关产品推荐

