如何用.htaccess将GET参数company值转为子域名并排除/api目录
前提配置
- 已配置泛域名解析:
*.example.com全部解析到你的Web服务器站点根目录 - Apache 已开启
mod_rewrite扩展,站点配置中AllowOverride设置为All允许.htaccess生效
.htaccess 完整配置
RewriteEngine On # 排除/api目录下所有请求,不执行后续重写规则 RewriteRule ^api(/.*)?$ - [L,NC] # 旧URL(主域名带company参数)301重定向到子域名格式 # 匹配主域名example.com(含www前缀的情况) RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] # 提取QUERY_STRING中的company参数值,同时保留其余参数 RewriteCond %{QUERY_STRING} (?:^|&)company=([^&]+)(?:&(.*))?$ [NC] # 重定向到子域名格式,保留原有路径和其余GET参数,移除company参数 RewriteRule ^(.*)$ https://%1.example.com/$1?%2 [L,R=301,NE] # 子域名格式URL内部重写,服务器端隐式添加company参数,用户无感知 # 匹配非www的子域名,提取子域名作为company参数值 RewriteCond %{HTTP_HOST} ^(?!www\.)([^.]+)\.example\.com$ [NC] # 防止循环重写:仅当QUERY_STRING中无company参数时执行 RewriteCond %{QUERY_STRING} !(?:^|&)company= [NC] # 内部追加company参数,原有GET参数全部保留 RewriteRule ^(.*)$ $1?company=%1 [QSA,L]
规则说明
[NC]:不区分大小写匹配[L]:当前规则匹配后不再执行后续规则[R=301]:返回301永久重定向,对SEO友好;测试阶段可改为R=302临时重定向,避免浏览器缓存错误规则[NE]:不对特殊字符进行URL编码,避免参数异常[QSA]:追加原有查询字符串,保证原有其他GET参数全部保留- 规则中的
(?!www\.)是排除www子域名,避免www.example.com被误识别为company参数值
测试建议
测试阶段先把301重定向改为302,确认所有跳转、参数保留、api目录排除逻辑完全正常后,再改回301正式上线。如果规则不生效,先检查泛域名解析、mod_rewrite扩展是否开启,以及站点配置是否允许.htaccess文件生效。
内容的提问来源于stack exchange,提问作者PWhite
相关产品推荐
相关产品推荐

