如何用Apache RewriteRule给查询字符串的archive键值添加文件路径
解决方案
正确的.htaccess重写规则
RewriteEngine On # 匹配包含archive参数的请求,捕获参数前后内容及参数值 RewriteCond %{QUERY_STRING} ^(.*&)?archive=([^&]+)(&.*)?$ [NC] # 重写URL,给archive值添加路径,保留其他查询参数 RewriteRule ^stackoverflow$ /stackoverflow?%1archive=/path/to/%2%3 [R=301,NC,L]
规则说明
- RewriteCond部分:
^(.*&)?:匹配archive参数之前的所有内容(可能包含其他参数和&,也可能为空)archive=([^&]+):精准捕获archive的参数值(直到下一个&或URL结尾)(&.*)?$:匹配archive参数之后的所有内容(可能包含其他参数和&,也可能为空)
- RewriteRule部分:
^stackoverflow$:仅匹配路径为/stackoverflow的请求,避免无意义的全局重写%1、%2、%3分别对应RewriteCond里的三个捕获分组,用来拼接新的查询字符串,保留原有其他参数的同时替换archive的值R=301表示永久重定向,L表示执行完这条规则后停止后续规则,NC表示不区分大小写匹配
原规则的问题
- 捕获分组引用错误:原规则中用
%1引用的是(^|&)分组,而非实际的文件名分组,应该用%2 - 无效语法:
&(*.)是错误写法,无法正确保留其他查询参数 - 路径匹配过宽:
^(.*)$会匹配所有路径,容易引发重写循环或错误匹配
内容的提问来源于stack exchange,提问作者HelpOverFlow
相关产品推荐
相关产品推荐

