26

I've got two options (return and rewrite) for redirection and I'm not sure which is recommended for performance, SEO, etc:

## Redirect from non-www to www
server {
        server_name example.com;
        # Option 1
        return 301 $scheme://$host$request_uri;

        # Option 2
        rewrite ^ http://$host$request_uri? permanent;
    }

## Default server config

server {
        ...
        listen      192.168.1.1:80 default_server;
        root        /www;
        server_name www.example.com;

Option 2 seems to work with curl but it's not redirecting when called by a browser and the return code is that of a temporary redirect despite the rewrite directive being set to permanent:

 curl -I example.com
 HTTP/1.1 302 Moved Temporarily
 Server: nginx
 ...
 Location: http://www.example.com/
 ...

2 Answers 2

23

Your option 1:

return 301 $scheme://$host$request_uri;

Is exactly what you want.

Not sure why the rewrite ^ http://$host$request_uri? permanent; line would result in a 302 instead of 301. That's the proper syntax to force it to return a 301.

2
  • 1
    I had to add "listen" directive to the first server block. It works fine however when I try to access the admin backend (Wordpress - wp-admin) there is some kind of loop and I can't get into the login page. Any ideas?
    – HTF
    Jul 12, 2012 at 11:06
  • 2
    That would probably be better dealt with in a separate question. Sounds like both your software (wordpress) and nginx are doing some redirecting, resulting in a loop.
    – Gnarfoz
    Jul 12, 2012 at 15:01
7

Technically, you can use both options. They can work.

According to the NGINX documentation, use return if you can. It is simpler and faster because NGINX stops processing the request (and doesn't have to process a regex). More than that, you can specify a code in the 3xx series:

return (301 | 302 | 303 | 307) url;

If you have a scenario where you need to validate the URL with a regex or need to capture elements in the original URL (that are obviously not in a corresponding NGINX variable), then you should use rewrite. You must know that rewrite returns only code 301 or 302.

rewrite regex URL [flag];

You can read more about return and rewrite on the NGINX website.

1
  • rewrite looks pretty nasty and like a horrific code smell to me.
    – dtc
    Feb 1, 2023 at 2:15

You must log in to answer this question.

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