使用正则重写时,含%20的URL触发.htaccess返回403错误
解决URL含%20时.htaccess重写触发403的问题
当URL路径中包含%20(空格的URL编码)时,Apache会自动将%{REQUEST_URI}解码为包含实际空格的字符串。你的原规则直接将这个带空格的内容作为查询参数传递,而未编码的空格在URL查询字符串中属于非法字符,触发了Apache的安全拦截,返回403错误。而用+表示空格时,+在URL路径部分不会被解码为空格,所以传递到参数里是合法字符,不会触发拦截。
解决方案
在RewriteRule中添加B(Escape Backreferences)标志,该标志会自动对反向引用中的特殊字符进行URL编码,把空格转换成%20,确保重定向后的URL合法。
修改后的规则:
RewriteCond %{REQUEST_URI} (.*)/(.*) RewriteRule ^(.+)$ /test.php?url=%2 [L,R=301,B]
如果你的需求是获取最后一个斜杠之后的路径部分,还可以简化规则,去掉多余的RewriteCond:
RewriteRule ^.+/(.+)$ /test.php?url=$1 [L,R=301,B]
这样更简洁,也能避免分组引用的混淆。
内容的提问来源于stack exchange,提问作者Roemer
相关产品推荐
相关产品推荐

