使用Rewrite规则移除URL中的%20编码空格
解决Apache Rewrite移除URL中%20的问题
你的问题出在正则表达式的字符集使用错误:[^%20]*是一个字符集合,它的作用是匹配除了%、2、0这三个字符之外的任意字符,所以只要路径里出现这三个字符中的任何一个,第一个分组就会停止匹配,比如aa2aa%20bbbb里的2会触发停止,导致规则无法正确捕获%20前的完整内容。
下面是两个可行的解决方法:
方法一:匹配解码后的空格(推荐)
Apache在处理RewriteRule时,会自动将URL编码的%20解码为空格,所以直接匹配空格即可:
- 如果是在
.htaccess文件中使用:
RewriteEngine On # 循环替换所有空格(对应原URL的%20) RewriteRule ^([^\s]*)\s+(.*)$ $1$2 [L,R=301]
- 如果是在服务器配置(Server Config)或虚拟主机(Virtual Host)中使用,路径需要加上开头的
/:
RewriteEngine On RewriteRule ^/([^\s]*)\s+(.*)$ /$1$2 [L,R=301]
规则逻辑:[^\s]*匹配第一个空格前的所有非空格字符,\s+匹配一个或多个空格,(.*)匹配剩余路径;[L]标志表示处理完当前规则后重新发起请求,这样会循环执行直到所有空格都被移除。
方法二:直接匹配编码后的%20
如果需要直接针对编码后的%20进行匹配(比如特殊场景下Apache未自动解码),可以用非贪婪匹配来避免被单个字符打断:
RewriteEngine On RewriteRule ^(.*?)%20+(.*)$ $1$2 [L,R=301]
规则逻辑:.*?是非贪婪匹配,会精准匹配到第一个%20前的所有内容(不会被%、2、0单独打断),%20+匹配一个或多个连续的%20,最终将两部分内容拼接后返回。
注意事项
- 测试阶段建议先用
R=302临时重定向,避免浏览器缓存错误的重定向规则,确认正常后再改为R=301永久重定向。 - 确保Apache已经启用
mod_rewrite模块。
内容的提问来源于stack exchange,提问作者Castellino Roberto
相关产品推荐
相关产品推荐

