18

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

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

我希望如果有人进入b.example.com/some,直接去a.example.com/some

4

3 回答 3

21

这与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
}
于 2012-05-10T11:04:40.153 回答
15

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

    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 请求中给出的主机名。

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

这个答案的灵感来自另一个使用类似方法的问题的答案。

于 2016-11-03T21:33:00.150 回答
4

@kolbyjack 和 @Matthijs 的组合版本用一个server块回答。此配置将重定向所有Host标头与example.com不同的请求,并仅处理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
    ...
}
于 2020-11-14T14:41:39.193 回答