如何使用nginx重写规则去除hypen( – )?

我正在使用这个重写规则redirect

example.com/abc?id=learn-more —-> http://example.com/abc?id=learnmore

rewrite ^/abc?id=learn-More http://example.com/abc?id=learnMore permanent 

但它不工作! 它正在redirect到

example.com/abc?id=learn-more(learn-more不会转换为learnmore)。

如何做到这一点?

你不能在nginx rewrite指令中匹配查询string。 你必须这样做:

 location ~* /(?<p1>[az]+)-(?<p2>[az]+)-(?<p3>[az]+) { if ($args ~ id=(?<q1>[az]+)-(?<q2>[az]+)) { rewrite ^ http://example.com/$p1$p2$p3?id=$q1$q2 permanent; } } 

这里我们使用正则expression式捕获来捕获破折号之间的URL部分到不同的nginxvariables( p1p2p3?<p1>之后(意味着匹配应该存储到p1variables。

然后,如果位置块匹配,那么我们尝试匹配查询string(nginx中的$args ),如果它包含用破折号分隔的两个单词。 如果find匹配,那么这些零件将被存储到q1q2

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

如果你只有一个(或者几个)完全匹配,那么你可以明确地检查参数。

 if ($arg_id = "learn-More"} { return 301 $scheme://$http_host$uri?id=learnMore } 

你将需要逃避? 在正则expression式中; 就目前来看,这表明c是可选的。

尝试:重写^ / abc \?id = learn-More http://example.com/abc?id=learnMore永&#x4E45;