我的重写规则目前是:
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
我应该如何更改上述正则表达式条件以满足要求?
答案 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}}上一条规则的关键字。
编辑:我混淆了break
和last
:)