每个nginx配置都可以用于广泛的域,但我想自动将请求重定向到第一个域名(官方域名)。如何配置nginx自动重定向到主主机名?
server {
server_name a.example.com b.example.com;
}
我想,如果有人进入b.example.com/some
,直接去a.example.com/some
每个nginx配置都可以用于广泛的域,但我想自动将请求重定向到第一个域名(官方域名)。如何配置nginx自动重定向到主主机名?
server {
server_name a.example.com b.example.com;
}
我想,如果有人进入b.example.com/some
,直接去a.example.com/some
这是几乎同样的事情为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
}
要在一台服务器块做到这一点,你可以,如果使用和$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,它使用类似的方法。
'server_name * .example.com;'如果有人想要将任何东西重定向到主域,''会捕获包括'www'和'porno'™和'whatsoever'的任何子域。对于http-> https重定向,您可以使用“server_name .example.com”包含任何内容 - 它将重定向example.com和* .example.com。 –
@DmitryVerhoturov使用'.example.com'时,有什么方法可以表明诸如'www.''等变体应该被重定向到'example.com'?没有使用降低性能的“if”条件? – PKHunter
@PKHunter,'.example.com'是覆盖'* .example.com'的最佳方式,[这里是文档](http://nginx.org/en/docs/http/server_names.html)。 –