如何通过.htaccess实现子域名重写映射到指定子目录并传递参数
.htaccess子域名重写规则调整方案
问题根源
你现有规则无法生效有两个核心原因:
- 规则顺序错误:通配范围更广的首页规则放在了前面,且携带
[L]标记,命中后会直接终止后续规则执行,分类规则永远不会被触发 - 参数提取错误:你使用
$1获取子域名前缀,但$1实际是RewriteRule匹配到的请求路径内容,无法拿到子域名的sub值
调整后的规则
动态子域名适配(适配任意前缀的子域名,自动提取前缀作为user参数)
RewriteEngine On # 优先处理分类页请求 RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteRule ^mycategory/?$ /subdomains/category.php?user=%1 [L,NC,QSA] # 再处理首页请求 RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteRule ^$ /subdomains/index.php?user=%1 [L,NC,QSA]
固定sub子域名适配
如果你仅需要适配sub.example.com这一个子域名,可以用更简单的写死规则:
RewriteEngine On RewriteCond %{HTTP_HOST} ^sub\.example\.com$ [NC] RewriteRule ^mycategory/?$ /subdomains/category.php?user=sub [L,NC,QSA] RewriteCond %{HTTP_HOST} ^sub\.example\.com$ [NC] RewriteRule ^$ /subdomains/index.php?user=sub [L,NC,QSA]
规则说明
%1用于读取前面对应RewriteCond中第一个括号捕获的内容,也就是子域名的前缀部分- 分类规则的匹配模式
^mycategory/?$同时兼容带尾斜杠和不带尾斜杠的访问路径 - 如果需要子域名下所有未匹配到规则的请求都走首页,可以将最后一条RewriteRule的匹配规则改为
^(.*)$
内容的提问来源于stack exchange,提问作者Bhargav Chaniyara
相关产品推荐
相关产品推荐

