我正在使用此重写规则来重定向
example.com/abc?id=learn-more ----> http://example.com/abc?id=learnmore
rewrite ^/a-b-c?id=learn-More http://example.com/abc?id=learnMore permanent
但它不起作用!它正在重定向到
example.com/abc?id=learn-more(learn-more 不会转换为 learnmore)。
如何实现这一点?
答案1
您无法在 nginx 指令中匹配查询字符串rewrite
。您必须执行以下操作:
location ~* /(?<p1>[a-z]+)-(?<p2>[a-z]+)-(?<p3>[a-z]+) {
if ($args ~ id=(?<q1>[a-z]+)-(?<q2>[a-z]+)) {
rewrite ^ http://example.com/$p1$p2$p3?id=$q1$q2 permanent;
}
}
p1
在这里我们使用正则表达式捕获来捕获到不同 nginx 变量( ,p2
和p3
)之间的 URL 部分,?<p1>
后面(
表示匹配项应该存储到p1
变量中。
然后,如果位置块匹配,则我们尝试匹配查询字符串($args
在 nginx 中),如果它包含两个用破折号分隔的单词。如果找到匹配项,则将各部分存储到 和q1
中q2
。
最后,我们使用捕获的部分执行实际的重写。
答案2
如果只有其中一个(或者几个)完全匹配,那么您可以明确检查该参数。
if ($arg_id = "learn-More"} {
return 301 $scheme://$http_host$uri?id=learnMore
}
答案3
您需要在正则表达式中转义“?”;因为它表示 c 是可选的。
尝试:重写 ^/abc\?id=learn-Morehttp://example.com/abc?id=learnMore永恒的