sorin
sorin

Reputation: 170668

How to configure nginx to auto redirect to the main hostname?

Each nginx config can act for a wide range of domains but I want to auto-redirect requests to the first domain name (the official one).

server {
    server_name a.example.com b.example.com;
}

I want that if someone enters b.example.com/some, to go directly to a.example.com/some

Upvotes: 25

Views: 55462

Answers (3)

Alexander Ushakov
Alexander Ushakov

Reputation: 5407

Combined version of @kolbyjack and @Matthijs answers with one server block. This config will redirect all requests with Host header different from example.com and process only example.com requests.

server {
    server_name example.com a.example.com b.example.com;

    if ($host != $server_name) {
        return 301 $scheme://$server_name$request_uri;
    }

    # processing requests to $server_name (example.com) only
    ...
}

Upvotes: 8

Matthijs Kooijman
Matthijs Kooijman

Reputation: 2797

To do this in a single server block, you can use an if and the $server_name variable:

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^ $scheme://$server_name permanent;
    }

Or, to keep any query parameters:

    server_name primary.tld secondary.tld;
    if ($host != $server_name) {
        rewrite ^/(.*) $scheme://$server_name/$1 permanent;
    }

Here, $server_name refers to primary server name, which is the first name in the server_name directive, while $host refers to the hostname given in the HTTP request.

Note that the if statement in nginx configuration does not always do what you would expect and its use is discouraged by some. See also https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

This answer was inspired by this answer to another question which uses a similar aproach.

Upvotes: 15

kolbyjack
kolbyjack

Reputation: 18290

This is pretty much the same thing as the GOOD example for http://wiki.nginx.org/Pitfalls#Server_Name. That is, you should use two servers:

server {
  server_name b.example.com;
  return 301 $scheme://a.example.com$request_uri;

  # For pre-0.8.42 installations:
  # rewrite ^ $scheme://a.example.com$request_uri? permanent;
}

server {
  server_name a.example.com;
  # Do stuff
}

Upvotes: 24

Related Questions