如何配置.htaccess:主域名重定向到static_site,子域名除外?
.htaccess 配置:主域名重定向到/static_site,保留HTTPS与去WWW功能
需求说明
- 主域名
example.com的请求需重写到/static_site目录 - 子域名
wp.example.com和another.example.com不受上述重写规则影响 - 保留强制HTTPS和移除www前缀的原有功能
初始配置问题
初始的.htaccess配置未区分主域名与子域名,所有域名的请求都会被重写到/static_site,不符合子域名站点的需求:
Options +FollowSymLinks -Multiviews <IfModule mod_rewrite.c> RewriteEngine on # 强制HTTPS并移除www RewriteCond %{HTTP_HOST} ^(www\.)(.+) [OR] RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^(www\.)?(.+) RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L] # 所有请求重写到/static_site RewriteCond %{REQUEST_URI} !^/static_site RewriteRule ^(.*)$ /static_site/$1 [L] </IfModule>
错误尝试的原因
后续添加的规则存在两处关键错误,导致出现503、403、404错误:
RewriteCond %{REQUEST_URI} =!wp.example.com RewriteCond %{REQUEST_URI} =!another.example.com RewriteRule ^(.*)$ /static_site/$1 [L]
- 错误使用
%{REQUEST_URI}变量:该变量存储的是请求路径,而非主机域名,无法匹配子域名 - 语法错误:
=!不是正确的否定匹配语法,正确的否定匹配应使用!前缀加正则表达式
最终正确配置
根据修正后的规则,既能满足主域名重写需求,又能保留原有HTTPS和去WWW功能,同时排除子域名:
Options +FollowSymLinks -Multiviews <IfModule mod_rewrite.c> RewriteEngine on # 强制HTTPS并移除www前缀 RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] # 主域名请求重写到/static_site,子域名除外 RewriteCond %{HTTP_HOST} ^example\.com$ RewriteCond %{REQUEST_URI} !^/static_site RewriteRule ^(.*)$ /static_site/$1 [L] </IfModule>
规则解释
- 强制HTTPS:当请求为HTTP时,重定向到相同主机名的HTTPS版本
- 移除www前缀:匹配带www的域名,重定向到去掉www的HTTPS域名
- 主域名重写:
- 仅匹配主域名
example.com - 排除已指向
/static_site的请求,避免循环重写 - 将所有请求转发到
/static_site目录下,不对外暴露重写行为(无外部重定向)
- 仅匹配主域名
内容的提问来源于stack exchange,提问作者user3780425
相关产品推荐
相关产品推荐

