调整rewrite规则实现非www域名带路径跳转至对应www域名路径
问题根源
当前重写规则的执行顺序存在错误:非WWW域名跳转到WWW域名的规则被放在了所有规则的末尾。当用户访问example.com/news这类不存在对应实体文件/目录的短链接时,会优先匹配到前面的RewriteRule ^ index.php [QSA,L]规则,请求路径被改写为index.php后才会执行域名跳转逻辑,最终跳转后路径丢失,就会跳转到站点首页。
修复方案
将非WWW跳转的两条规则移动到RewriteEngine On之后的最靠前位置,优先处理域名跳转逻辑,再执行后续路径重写规则即可。
修改后的完整配置
# BEGIN Spark AddDefaultCharset UTF-8 <IfModule mod_rewrite.c> RewriteEngine On # 非WWW域名强制跳转WWW,移到最前优先执行 RewriteCond %{HTTP_HOST} ^example.com RewriteRule (.*) https://www.example.com/$1 [R=301,L] RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L] </IfModule> <IfModule mod_deflate.c> <FilesMatch "\.(html|php|txt|xml|js|css|ttf|otf|ico|json|svg|)$"> SetOutputFilter DEFLATE </FilesMatch> </IfModule> # END Spark
提示:修改配置后请清空浏览器缓存再测试,301永久重定向会被浏览器长时间缓存,未清缓存可能无法验证修改效果。
内容的提问来源于stack exchange,提问作者Theo Dor
相关产品推荐
相关产品推荐

