如何配置nginx自动重定向到主主机名?

时间:2012-05-10 10:19:29

标签: nginx http-redirect

每个nginx配置都可以用于各种域名,但我想将请求自动重定向到第一个域名(官方域名)。

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

如果有人输入b.example.com/some,我想要直接转到a.example.com/some

3 个答案:

答案 0 :(得分:10)

这与http://wiki.nginx.org/Pitfalls#Server_Name的GOOD示例非常相似。也就是说,您应该使用两台服务器:

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
}

答案 1 :(得分:4)

要在单个服务器块中执行此操作,您可以使用if和$server_name variable

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

或者,保留任何查询参数:

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

这里,$server_name指的是主服务器名称,它是server_name指令中的第一个名称,而$host指的是HTTP请求中给出的主机名。

请注意,nginx配置中的if语句并不总是按照您的预期执行,有些人不鼓励使用它。另请参阅https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

这个答案的灵感来自this answer to another question,它使用了类似的方法。

答案 2 :(得分:0)

@kolbyjack和@Matthijs的组合版本带有一个server块。此配置将重定向与{em> example.com 不同的Host标头的所有请求,并且仅处理 example.com 请求。

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
    ...
}