每个nginx配置都可以用于各种域名,但我想将请求自动重定向到第一个域名(官方域名)。
server {
server_name a.example.com b.example.com;
}
如果有人输入b.example.com/some
,我想要直接转到a.example.com/some
答案 0 :(得分:10)
这与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
}
答案 1 :(得分:4)
要在单个服务器块中执行此操作,您可以使用if和$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
指的是HTTP请求中给出的主机名。
请注意,nginx配置中的if
语句并不总是按照您的预期执行,有些人不鼓励使用它。另请参阅https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
这个答案的灵感来自this answer to another question,它使用了类似的方法。
答案 2 :(得分:0)
@kolbyjack和@Matthijs的组合版本带有一个server
块。此配置将重定向与{em> example.com 不同的Host
标头的所有请求,并且仅处理 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
...
}