通过.htaccess从URL参数生成动态子域名遇404问题求助
泛域名动态映射与URL重写解决方案
问题分析
你现有的.htaccess代码存在两处关键错误:
- RewriteCond的正则表达式写错:
^(^.*)\.example.com多了一个^,导致无法正确匹配子域名前缀 - 未区分内部转发和外部重定向逻辑,也没排除主域名本身的访问请求
修正后的.htaccess代码
将根目录的.htaccess替换为以下内容:
RewriteEngine On # 1. 处理子域名访问:将xxx.example.com转发到index.php?country=xxx # 排除主域名(example.com)和www子域名(可根据需求调整) RewriteCond %{HTTP_HOST} !^example\.com$ RewriteCond %{HTTP_HOST} !^www\.example\.com$ RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$ [NC] RewriteRule ^(.*)$ /index.php?country=%1 [L,QSA] # 2. 处理反向重定向:将example.com/index.php?country=xxx重定向到xxx.example.com RewriteCond %{QUERY_STRING} ^country=([a-z0-9-]+)$ [NC] RewriteRule ^index\.php$ https://%1.example.com/ [R=301,L]
关键规则说明
[NC]:忽略大小写,兼容USA、Usa等格式的子域名/参数[L]:停止执行后续规则,避免规则冲突[QSA]:保留原URL的其他查询参数(如果有额外参数需求)R=301:永久重定向,利于SEO;测试阶段可改用R=302临时重定向
额外注意事项
- 确保cPanel中主域名的DocumentRoot设置为根目录,且泛域名(
*.example.com)指向同一根目录(因为未创建子域名文件夹,需让所有泛域名请求落到主域名根目录) - 检查服务器是否开启
mod_rewrite模块(cPanel默认开启,可在Apache模块管理中确认) - 测试前清空浏览器缓存,避免旧缓存干扰结果
内容的提问来源于stack exchange,提问作者phplearner
相关产品推荐
相关产品推荐

