使用.htaccess将www重定向至非www域名失败问题求助
问题分析与修复方案
你的问题核心是www重定向规则完全无效,同时规则顺序错误,导致www域名的请求没被转去非www,而CSP里的'self'只匹配example.com,所以静态文件加载触发CSP报错。
原代码的两个致命问题
- www重定向规则写错了:
RewriteRule里用%{HTTP_HOST}还是带www的域名,等于重定向到自己,根本没切换到非www - 规则顺序颠倒:先做了public目录的内部重写,再做外部重定向,会导致重定向的目标路径出错
修正后的.htaccess代码
<IfModule mod_rewrite.c> RewriteEngine On # 1. 优先处理www域名重定向到非www的HTTPS地址 RewriteCond %{HTTP_HOST} ^www\.(.+) [NC] RewriteRule ^(.*)$ https://%1/$1 [L,R=301] # 2. 处理非www的HTTP请求重定向到HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301] # 3. 最后处理public目录的内部重写 RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule> <IfModule mod_headers.c> Header set Content-Security-Policy "default-src 'self'; font-src https://fonts.gstatic.com; style-src 'self' https://fonts.googleapis.com; img-src 'self'; child-src 'none';" # 其他Header规则... </IfModule>
关键修改说明
- 把重定向规则放在内部重写前面:外部跳转(301)要先执行,确保用户最终访问的是统一的非www HTTPS地址,再做内部的目录转发
- www重定向用
%1替代%{HTTP_HOST}:%1对应RewriteCond里捕获的www\.后面的域名部分(也就是example.com),这样就能正确跳转到非www地址 - 规范CSP规则写法:原代码里
Content-Security-Policy:后面的冒号是多余的,去掉后更符合Apache配置规范
这样修改后,所有www的请求都会被301重定向到非www的HTTPS地址,CSP的'self'就能匹配正确的域名,静态文件加载就不会触发规则违反了。
内容的提问来源于stack exchange,提问作者jag6
相关产品推荐
相关产品推荐

