我有一个看起来像以下任何一项的字符串:
1) /tag/example/123
2) /tag/example/123/
3) /tag/example/123/1v1
4) /tag/example/123/1v1/yes/no/maybe
我正在用nginx重写这个字符串,如下所示:
rewrite ^/tag/example/(d*)/(.*) /example/$1/$2;
对于字符串 1,$uri最终需要看起来像/example/123)。/example/123/1v1 表示字符串 3)。等等...
通过这次重写,我需要 $1 才能成为 123,$2 是字符串的其余部分。如果 123(字符串 1)之后什么都没有,我需要 $2 才能为空。此正则表达式适用于 2)、3) 和 4),但不适用于 1)。1) 使重写中止,因为/在 123 之后不存在。
输出:
1) Aborts
2) $1 = 123, $2 = NULL
3) $1 = 123, $2 = 1v1
4) $1 = 123, $2 = 1v1/yes/no/maybe
如何让它适用于所有字符串?
你试过吗?
rewrite ^/tag/example/(d*)/?(.*) /example/$1/$2;
我不确定这是否转换为 nginx,但对于 Perl 正则表达式,您需要使用非捕获括号,如下所示:
s^(?:/tag)?(?:/example)((((/d*)(/)?)(1v1)?)(/yes/no/maybe)?)^example/$1$2$3$4^g
恐怕我用"^"代替/来保持答案直截了当 - 我不能说是否可以在 nginx 中使用这种替换,但我认为正则表达式很好。
我认为您解决了您的问题,但是万一其他人看不到如何修改代码以允许斜杠之间的任何字母数字字符组合,我认为这应该很好:
s^(?:/tag)?(?:/example)((((/d*)(/)?)(w+?)?)(/w+?/w+?/w+?)?)^example/$1$2$3$4^g