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

sor*_*rin 10 nginx http-redirect

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

server {
    server_name a.example.com b.example.com;
}
Run Code Online (Sandbox Code Playgroud)

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

kol*_*ack 11

这与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
}
Run Code Online (Sandbox Code Playgroud)

  • 如果有人希望将任何内容重定向到主域,“server_name *.example.com;”将捕获任何子域,包括“www”、“porno”和“whatsoever”。对于 http->https 重定向,您可以使用 `server_name .example.com` 包含任何内容 - 它将重定向 example.com 和 *.example.com。 (2认同)
  • @PKHunter,“.example.com”是覆盖“*.example.com”的最佳方式,[这里是文档](http://nginx.org/en/docs/http/server_names.html)。 (2认同)

Ale*_*kov 8

@kolbyjack 和 @Matthijs 的组合版本用一个server块来回答。此配置将重定向所有标头与example.comHost不同的请求,并仅处理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
    ...
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*man 6

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

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

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

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

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

请注意,ifnginx配置中的语句并不总是能满足您的期望,某些人不建议使用它。另请参阅https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

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