2012-05-10 63 views
7

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

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

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

回答

9

这是几乎同样的事情为http://wiki.nginx.org/Pitfalls#Server_Name很好的例子。也就是说,你应该使用两台服务器:

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

'server_name * .example.com;'如果有人想要将任何东西重定向到主域,''会捕获包括'www'和'porno'™和'whatsoever'的任何子域。对于http-> https重定向,您可以使用“server_name .example.com”包含任何内容 - 它将重定向example.com和* .example.com。 –

+0

@DmitryVerhoturov使用'.example.com'时,有什么方法可以表明诸如'www.''等变体应该被重定向到'example.com'?没有使用降低性能的“if”条件? – PKHunter

+0

@PKHunter,'.example.com'是覆盖'* .example.com'的最佳方式,[这里是文档](http://nginx.org/en/docs/http/server_names.html)。 –

0

要在一台服务器块做到这一点,你可以,如果使用和$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指HO在HTTP请求中给出的stname。

请注意,nginx配置中的if语句并不总是按照您所期望的那样进行,其中的一些使用不受欢迎。另请参见https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

此答案受启发于this answer to another question,它使用类似的方法。

相关问题