如何使用 nginx 重写规则删除连字符 (-)?

如何使用 nginx 重写规则删除连字符 (-)?

我正在使用此重写规则来重定向

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 变量( ,p2p3)之间的 URL 部分,?<p1>后面(表示匹配项应该存储到p1变量中。

然后,如果位置块匹配,则我们尝试匹配查询字符串($args在 nginx 中),如果它包含两个用破折号分隔的单词。如果找到匹配项,则将各部分存储到 和q1q2

最后,我们使用捕获的部分执行实际的重写。

答案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永恒的

相关内容