Nginx rewrite: last & break
Maxim Dounin
mdounin at mdounin.ru
Sun Oct 23 15:26:04 UTC 2011
Hello!
On Sat, Oct 22, 2011 at 02:04:21PM +0300, Nginx User wrote:
> On 22 October 2011 06:30, Ryan Chan <ryanchan404 at gmail.com> wrote:
> > Anyone would like to do a quick summary for the issue?
>
> Minaev's answer in the serverfault link you provided is the clearest
> explanation I have seen to date of this.
>
> To paraphrase, he says, within a location block, when you use "last"
> the rewrites are stopped and a new subrequest is generated which will
Just a side note: "subrequest" is incorrect term here.
> take all all locations into account. When you use "break" the rewrites
> are stopped and processing continued within the location you are in.
>
> Adding Maxim's statement above into account, outside a location block,
> "break" behaves just like "last" does since there are no location
> directives to run here.
>
> Someone just needs to update the docs if this is correct.
Reading rewrite module docs carefully enough will tell basically
the same:
...
If the URI changed as a result of the execution of directives
inside location, then location is again determined for the new
URI. This cycle can be repeated up to 10 times, after which Nginx
returns a 500 error.
...
...
Example:
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
But if we place these directives in location /download/, then it
is necessary to replace flag "last" by "break", otherwise Nginx
will hit the 10 cycle limit and return error 500:
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
...
The translation though looks awful and needs re-translation;
additionally, it was already polluted with user comments, and this
doesn't improve readability either.
Maxim Dounin
More information about the nginx
mailing list