每个nginxconfiguration可以代理广泛的域名,但我想自动redirect请求到第一个域名(官方)。
server { server_name a.example.com b.example.com; }
如果有人inputb.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 }
要在单个服务器块中执行此操作,可以使用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请求中给出的主机名称。
请注意,nginx配置中的if
语句并不总是按照您所期望的来执行,其中的一些使用不受欢迎。 另见https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
这个答案的灵感来自于另一个使用类似的问题的问题的答案 。