.htaccess含特殊字符与双斜杠URL的301重定向问题求助
解决.htaccess中含特殊字符和双斜杠URL的301重定向问题
嗨,我来帮你搞定这个问题!你遇到的这两个场景(带%的URL和含双斜杠//的URL)确实需要特殊处理,因为Apache在解析URL时会做自动转义或规范化,导致你直接写的RewriteRule匹配不到。
问题分析
- 带
%的URL:%在URL里是转义字符,Apache会自动把%25解析成%,但当你在RewriteRule里直接写%时,它会被当作转义序列的开始,规则自然匹配失败。 - 含双斜杠
//的URL:Apache默认会自动把多个连续斜杠合并成一个,所以当请求catalogsearch/result//jivaraj-mamari时,实际被处理的是catalogsearch/result/jivaraj-mamari,你写的带//的规则就匹配不到了。
解决方案
你需要调整规则,针对这两种情况分别处理,而且要把这些规则放在现有规则的最前面,避免被其他规则提前拦截:
1. 处理带%的URL
我们需要匹配浏览器发送的原始请求(未被转义的),可以用THE_REQUEST变量,它记录了原始请求行,包含未转义的%:
# 匹配带%的tropicana产品URL,重定向到首页 RewriteCond %{THE_REQUEST} \s/products/tropicana-100%-apple-juice-tetra-pack\s [NC] RewriteRule ^ / [R=301,L]
2. 处理含双斜杠的URL
针对双斜杠的情况,我们可以直接捕获原始请求中的双斜杠来匹配:
# 处理带双斜杠的搜索结果URL重定向到首页 RewriteCond %{THE_REQUEST} \s/catalogsearch/result//jivaraj-mamari\s [NC] RewriteRule ^ / [R=301,L]
完整的.htaccess配置示例
把新规则放在现有规则的最前面,最终配置如下:
RewriteEngine On RewriteBase / # 处理带%的产品URL重定向到首页 RewriteCond %{THE_REQUEST} \s/products/tropicana-100%-apple-juice-tetra-pack\s [NC] RewriteRule ^ / [R=301,L] # 处理带双斜杠的搜索结果URL重定向到首页 RewriteCond %{THE_REQUEST} \s/catalogsearch/result//jivaraj-mamari\s [NC] RewriteRule ^ / [R=301,L] # 你的现有规则 RewriteRule ^category/energy-drinks-juices/sub-category-1$ category/energy-and-health-drinks [R=301,L] RewriteCond %{QUERY_STRING} $ [NC] RewriteRule ^category/home-care/filter/cat/(.*)$ / [L,R=301]
为什么之前的规则失效?
- 对于
%:你直接在RewriteRule里写%,Apache会尝试解析它为转义字符(比如%20代表空格),无法正确匹配实际请求的URL。用THE_REQUEST变量就能获取到原始的、包含%的请求字符串。 - 对于双斜杠:Apache的
mod_dir模块默认会把多个连续斜杠合并成一个,规则执行时URL已经被规范化成单斜杠,你的带//的规则自然匹配不到。用THE_REQUEST就能捕获到浏览器发送的原始双斜杠请求。
记得测试前清空浏览器缓存,因为301重定向会被浏览器缓存,可能影响测试结果哦!
内容的提问来源于stack exchange,提问作者user6051114
相关产品推荐
相关产品推荐

