RewriteRule规则调整:实现URL中?替换为/的跳转需求
正确的Apache RewriteRule规则实现URL映射
你的原规则无法生效的核心原因:
- RewriteRule的匹配模式仅作用于URL的路径部分(即
?之前的内容),不会包含查询字符串。 - 正则中的
?是特殊元字符,即使转义也无法捕获?后的内容,因为这部分不属于路径匹配范围。
要实现你需要的URL映射,需结合RewriteCond捕获查询字符串,再通过RewriteRule拼接目标URL:
RewriteEngine On # 拆分查询字符串:%1捕获第一个&之前的内容,%2捕获剩余参数 RewriteCond %{QUERY_STRING} ^([^&]+)&?(.*)$ # 匹配路径并拼接目标URL RewriteRule ^/open.html$ https://www.domain2.com/c/%1?%2 [NC,R=301,L]
规则细节说明:
RewriteCond %{QUERY_STRING} ^([^&]+)&?(.*)$:将查询字符串拆分为两部分,%1对应cuSDyh,%2对应utm_medium=rep-email。RewriteRule ^/open.html$ https://www.domain2.com/c/%1?%2:匹配原路径/open.html,把%1插入到目标路径中,%2保留为新的查询字符串。- 标志
[NC,R=301,L]:NC忽略大小写,R=301表示永久重定向,L表示匹配后终止后续规则处理。
如果使用Nginx,对应的通用规则如下:
if ($request_uri ~* ^/open.html\?([^&]+)&?(.*)$) { rewrite ^ https://www.domain2.com/c/$1?$2 permanent; }
内容的提问来源于stack exchange,提问作者Sayem
相关产品推荐
相关产品推荐

