Rewrite rules from Apache again

Francis Daly francis at
Wed Jun 11 17:05:50 UTC 2014

On Wed, Jun 11, 2014 at 06:20:50PM +0200, Luciano Mannucci wrote:
> On Tue, 10 Jun 2014 22:43:05 +0100
> Francis Daly <francis at> wrote:

Hi there,

> > The rest of the config?
> :)
> Well, I've posted it in my previous request for help. Beeing
> longish I tried to spare some bandwith... :)

No worries.

It can be useful to have a minimal test case that shows the problem.

> I had it under "location /"
> Moving it to "server" level and adding a "break" seems to make it work!

Very approximately, the order is:

choose the server{}
 run the rewrite directives
 choose the location{}
  run the rewrite directives, looping back as necessary
  handle the request

So your non-server-level rewrites will only apply if they are in the
location{} that is chosen.

> >   location = /pagina.php {
> >     return 200 "I got $uri$is_args$args from $request_uri\n";
> >   }
> Many thanks for this elegant way of debugging this kind of
> configuration problems.

You're welcome.

You may also find it useful to enable debug logging for your test client,
such as by putting something like


within the events{} block, and then looking in error_log.

> If I try the same thing in a subdirectory, it doesn't work.

Put the rewrites at server{} level, or in the location{} that is chosen.

> It seems that the "location =" that I've put to intercept the rewrite
> doesn't match.


The rewrite that you want doesn't happen, because the request
/en/privacy.php is handled in:

>         location ~ \.php$ {
>         location / {
>         location ^~ /en/ {
>             location = /en/pagina.php {
>             location ~ \.php$ {

...that location, and not in the one two above it.

Good luck with it,

Francis Daly        francis at

More information about the nginx mailing list