每个 nginx 配置都可以适用于广泛的域,但我想将请求自动重定向到第一个域名(官方域名)。
server {
server_name a.example.com b.example.com;
}
我希望如果有人进入b.example.com/some
,直接去a.example.com/some
每个 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的 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
}
要在单个服务器块中执行此操作,您可以使用 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 请求中给出的主机名。
请注意,if
nginx 配置中的语句并不总是符合您的预期,并且有些人不鼓励使用它。另请参阅https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
这个答案的灵感来自另一个使用类似方法的问题的答案。
@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
...
}