Apache重定向规则覆盖异常问题排查
问题分析与解决方案
从你提供的curl调试结果来看,Article-2的跳转目标出现了异常的$%224字符,这说明第二条特定Rewrite规则的语法存在问题,导致这条规则没有被正确匹配,请求最终落到了兜底规则上。
修复步骤
移除目标URL的双引号:
Apache的RewriteRule中,目标URL不需要用双引号包裹(除非目标包含空格等特殊字符)。把第二条规则修改为:RewriteRule ^/2018/04/02/Article-2/$ http://testdomain2.com/Article-2 [R=301,L]同时建议把第一条规则也统一去掉双引号,保持语法一致:
RewriteRule ^/2018/04/01/Article-1/$ http://testdomain2.com/Article-1 [R=301,L]测试单条规则验证:
暂时注释掉其他规则,只保留第二条特定规则,用curl重新测试:curl -0 http://www.testdomain1.com/2018/04/02/Article-2/ -v确认返回的Location头是正确的
http://testdomain2.com/Article-2,再恢复其他规则。
问题原因
当你用双引号包裹目标URL时,Apache的重写引擎会错误地解析目标中的$符号,将其与正则反向引用(比如$1、$2)混淆,导致生成了异常的跳转地址。这条规则因此无法正确匹配请求,请求就被后续的兜底规则捕获了。
针对6400条规则的优化建议
如果要添加6400条类似的特定跳转规则,直接逐条写RewriteRule会导致Apache配置臃肿,且影响请求处理性能。建议:
- 使用单独配置文件:把所有跳转规则放到一个单独的文件(比如
redirects.conf),然后在主配置中用Include /path/to/redirects.conf引入,便于维护。 - 改用RewriteMap:如果这些跳转规则是有规律的(比如原路径是
/年/月/日/文章名/,新路径是http://testdomain2.com/文章名),可以用RewriteMap来简化配置。例如:
然后在RewriteEngine on RewriteMap articleRedirects txt:/path/to/article-redirects.txt # 匹配符合格式的文章路径 RewriteRule ^/[0-9]{4}/[0-9]{2}/[0-9]{2}/([^/]+)/$ ${articleRedirects:$1|http://testdomain2.com/} [R=301,L] # 兜底规则保留 RewriteCond %{REQUEST_URI} !\.(gif|jpe?g|png)$ [NC] RewriteRule ^(.*)$ http://testdomain2.com/ [R=301,L]article-redirects.txt中每行写一个映射:
这种方式比逐条写Article-1 http://testdomain2.com/Article-1 Article-2 http://testdomain2.com/Article-2 # 其他6398条规则...RewriteRule性能更高,也更易于维护。
内容的提问来源于stack exchange,提问作者Cameron Kilgore
相关产品推荐
相关产品推荐

