改变nginx重写正则表达式条件

时间:2013-07-20 17:40:36

标签: regex nginx rewrite

我的重写规则目前是:

rewrite ^/answer/1/(www\.)*(.)(.+)$ /answer/1/$2.html last;

所以请求如:

mydomain.co.uk/answer/1/aa
mydomain.co.uk/answer/1/www.aa
mydomain.co.uk/answer/1/www.aa/
mydomain.co.uk/answer/1/www.aa/something
mydomain.co.uk/answer/1/www.aa/something/even-deeper/and-so-on

提供文件:

mydomain.co.uk/answer/1/a.html

现在我想拆分响应,以便请求如下:

mydomain.co.uk/answer/1/aa
mydomain.co.uk/answer/1/www.aa
mydomain.co.uk/answer/1/www.aa/

将提供以前的文件:

mydomain.co.uk/answer/1/a.html

但请求更进一步,例如:

mydomain.co.uk/answer/1/www.aa/something
mydomain.co.uk/answer/1/www.aa/something/even-deeper/and-so-on

将提供新文件:

mydomain.co.uk/answer/1/new.html

我应该如何更改上述正则表达式条件以满足要求?

1 个答案:

答案 0 :(得分:1)

我不在家,所以我现在无法测试,但这样的事情应该有效:

rewrite ^/answer/1/(www\.)*(.)(.+)/(.+)$ /answer/1/new.html break;
rewrite ^/answer/1/(www\.)*(.)(.+)$ /answer/1/$2.html last;

让我解释一下:如nginx文档(here

中所述
break
stops processing the current set of ngx_http_rewrite_module directives;

因此,如果请求与第一个重写规则匹配(类似于您的重写但以/(.+)指令结束。这意味着将匹配已匹配的每个请求但当且仅当后面跟着斜杠后面有1个或多个字符。请注意这一点,因为这意味着以下网址:

mydomain.co.uk/answer/1/www.aa// (yes this is a valid url)

将重定向到:

mydomain.co.uk/answer/1/new.html

如果你不想要这个行为,你可以修改正则表达式如下:

rewrite ^/answer/1/(www\.)*(.)(.+)/(([^/]+/?)+)$ /answer/1/new.html break;

这里(([^/]+/?)+)指令说:一切都不是/重复一次或多次,而且可能是或不跟随/。所有这一切都重复了一次或多次。

我再说一遍,我现在无法测试它,但它应该按预期工作。请记住,这里是重写url的顺序,因为我正在测试应该重写为mydomain.co.uk/answer/1/new.html的url的FIRST,然后你的旧重写仍将与url匹配,但是由于{{{n}而不会被nginx处理1}}上一条规则的关键字。

编辑:我混淆了breaklast:)