含特殊字符URL的Apache RewriteMap无法正常工作
Apache RewriteMap 处理特殊字符URL失效的解决方案
问题核心在于:Apache默认会对请求URL做解码处理,RewriteRule捕获的$1是解码后的纯文本路径,但你的映射DB里存的是URL编码后的路径,两者格式不匹配,导致特殊字符请求无法命中规则。
解决步骤
1. 给RewriteMap添加escape参数
修改映射指令,让Apache将捕获的路径重新编码后再查询映射表:
RewriteMap redirects dbm=db:/etc/httpd/conf.d/test.db escape
escape参数会把$1的解码内容重新转换成URL编码格式,和你DB中存储的编码路径完全匹配,特殊字符(比如%C2%A0、%C3%A3)就能正常命中规则。
2. 确保DB文件生成正确
如果用httxt2dbm工具生成DB文件,直接使用原始的映射文本文件(保留所有%xx编码字符),不要提前对内容做解码处理,否则会导致映射关系失效。
3. 合并优化Rewrite规则
可以把两条规则合并,同时匹配带/不带末尾斜杠的请求,减少重复判断:
RewriteEngine On RewriteMap redirects dbm=db:/etc/httpd/conf.d/test.db escape # 匹配带或不带末尾斜杠的路径 RewriteCond ${redirects:$1} != "" RewriteRule ^(.*?)/?$ ${redirects:$1} [R=permanent,L]
.*?是非贪婪匹配,/?匹配可选的末尾斜杠,一条规则覆盖两种场景,配置更简洁。
内容的提问来源于stack exchange,提问作者Karen Kostanyan
相关产品推荐
相关产品推荐

