摘要:记录了一次配置NGINX的rewrite规则的过程。

预期效果

/aa/bb -> /index.php?title=bb&&variant=aa

其中aa的可能取值是:

  1. zh-cn
  2. zh-hk
  3. zh-mo
  4. zh-my
  5. zh-sg
  6. zh-tw

实现过程

最初,设计的规则如下:

rewrite ^\/(zh-[a-z]{2,4})\/([^?]*) /index.php?title=2&variant=1 last;

但是nginx提示range out of order in character class
也就是说,nginx把规则中zh--当成了正则语法中的连接符-,而实际上我们想把-作为字符-进行匹配。因此,这里涉及到一个字符转义的问题。但是这里的转义存在一个小坑。
正常情况了,我们会想到用\进行转义,也就是\-,但在这里不行。用\进行转义后,-恢复了它的字面值,依然是-,依然是正则中的连接符,因此需要二次转义,即\\-
最终的规则如下:

rewrite "^\/(zh\\-[a-z]{2,4})\/([^?]*)" /index.php?title=2&variant=1 last;