如何配置.htaccess实现www跳转非www且子目录正常生效?
你的配置存在三个核心问题导致子目录跳转不生效,且和你的需求完全反向:
- 跳转逻辑写反:现有规则是非www域名跳转到www域名,和你要的www跳非www的需求完全相反
- 域名跳转后强制转回HTTP:你已经配置了HTTP转HTTPS,但域名跳转规则里又写死了http前缀,会产生多余跳转甚至跳转回环
- 重定向规则匹配逻辑有误,且和内部重写规则的优先级处理不当,导致子目录路径未触发域名跳转
修正后的配置
RewriteEngine On # 统一跳转HTTP到HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 所有带www的域名跳转至非www域名,匹配全路径 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [L,R=301] # 内部路径重写规则放在跳转规则之后 RewriteRule blog/(.*)/ viewpost.php?page=$1 [L] RewriteRule blog/(.*) catpost.php?page=$1 [L]
调整说明
- 修正了域名跳转逻辑:匹配所有带www前缀的请求,捕获不带www的主域名部分直接跳转,所有路径都会被覆盖,不存在子目录失效的问题
- 跳转全程保持HTTPS协议,避免多次跳转
- 所有重定向规则放在内部重写规则之前,确保域名跳转优先执行,不会被内部路径重写拦截
- 新增
[NC]标记匹配域名时不区分大小写,避免大小写问题导致匹配失效 - 给所有规则补充明确的
[L]标记,匹配到对应规则后不再执行后续逻辑,避免规则冲突 - 调整完成后请清空浏览器缓存再测试,旧的301永久重定向规则会被浏览器缓存,可能影响测试结果
内容的提问来源于stack exchange,提问作者vo8091
相关产品推荐
相关产品推荐

