0

我的重写规则目前是:

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

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

4

1 回答 1

1

我不在家,所以我现在无法测试它,但这样的东西应该可以工作:

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

让我解释一下:如 nginx 文档(此处)中所述

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 的顺序,因为我首先测试应该重写的 url,mydomain.co.uk/answer/1/new.html然后你的旧重写仍然与 url 匹配,但不会被 nginx 处理,因为break前面的规则的关键字。

编辑:我很困惑lastbreak:)

于 2013-07-20T18:08:11.350 回答