5

I'm trying to redirect a subfolder to a subdomain in nginx. I want http://example.com/~meow/ to be redirected to http://meow.example.com/. I tried the following:

location ~ ^/\~meow/(.*)$ {
    rewrite ^(.*)$ http://meow.example.com$1 permanent;
}

But it doesn't work. It gets caught by my location block for user directories:

location ~ ^/~([^/]+)/(.+\.php)$ {
    [...]
}

and

location ~ ^/\~([^/]+)/(.*)$ {
    [...]
}

So, how would I do this? Oh, and I only want /~meow/ to be redirected. All other user directories should not be changed.

3 Answers 3

4

You could try using nested location like this

location ~ ^/\~([^/]+)/(.*)$ {
  location ~ ^/\~meow/(.*)$ {
    rewrite ^(.*)$ http://meow.example.com$1 permanent;     
  }
  [...]
}
1
  • +1 for nested. These things have a way of growing out of proportion over time and keeping it nested means you're not scratching your head what you missed that prevents it from working.
    – Mel
    May 16, 2011 at 0:11
6

A static location would be more efficient for what you're asking. If you read the four rules at http://wiki.nginx.org/HttpCoreModule#location , you'll see that a locaion ^~ will not be overridden by a regex location. You also seem to want to strip the leading /~meow while redirecting. The correct approach would be:

location ^~ /~meow/ {
  rewrite ^/~meow(.*) http://meow.example.com$1 permanent;
}

As an aside, there's no reason to capture the entire uri when rewriting. The current uri is already saved in $uri.

rewrite ^(.*)$ http://meow.example.com$1 permanent;

and

rewrite ^ http://meow.example.com$uri permanent;

will always produce the same result, and the second rewrite is more efficient, since it's a short circuited match and already contains what you're trying to capture anyway.

1
  • Excellent with the one liners! + Repped Feb 19, 2013 at 16:52
1

Regexp locations are checked in the order of their appearance in the configuration file and the first positive match is used. Which means, your location ~ ^/\~meow/(.*)$ must be above other two locations in the configuration file.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .