我需要实现下面给出的Map:
https://www.domain1.com/open.html?cuSDyh&utm_medium=rep-email
to
https://www.domain2.com/c/cuSDyh?utm_medium=rep-email
我写了一个重写规则来实现这一点,这似乎是错误的,因为“?”在最终结果中没有被替换。
RewriteRule ^/open.html?(.*)$ https://www.domain2.com/c/$1 [NC,R=301,L]
有人能帮我找到正确的重写规则吗?
1条答案
按热度按时间2mbi3lxu1#
这里有几个问题使规则无法工作:
RewriteRule
pattern(第一个参数)仅与URL路径匹配,特别是不包括查询字符串。要匹配查询字符串,您需要一个附加的 condition(RewriteCond
指令)并与QUERY_STRING
服务器变量匹配。RewriteRule
* 模式 * 匹配的URL路径不是以斜杠开头。请注意,
RewriteRule
pattern 是一个正则表达式。上面正则表达式中未转义的?
是一个特殊的 meta字符(* 量词 *),它使前面的标记 optional 成为可选的。因此,在您的示例中,l
是可选的。(尽管您无论如何都要匹配后面的所有内容,所以?
是完全多余的。)我假设第一个URL参数(例如您的示例中的
cuSDyh
)仅由字母(小写或大写)组成,并且不是name=value对(根据您的示例)。请尝试以下方法:
%1
和%2
反向引用与前面的 CondPattern 中捕获的子组匹配。例如,%1
与第一个URL参数匹配(例如,示例中的cuSDyh
),%2
与所有后续URL参数匹配(不包括分隔符)。RewriteRule
指令上需要NE
标志(而不是NC
),以防止URL的查询字符串部分在重定向响应中进行双重URL编码。(QUERY_STRING
变量已经进行了URL编码。)如果在第一个URL参数之后没有其他的URL参数,那么上述规则实际上会附加一个空的查询字符串(由尾随的
?
表示)。但是,尾随的?
会被Apache在重定向响应中自动删除。为了避免潜在的缓存问题,请始终首先使用302(临时)重定向进行测试,并且在测试完成后仅更改为301(永久)重定向(如果这是目的)。