nginx命令的server_name重写规则

时间:2012-05-15 09:53:33

标签: nginx rewrite

我正在使用serverserver_name来处理nginx重写规则。 documentation对于优先顺序听起来很简单明了,但是我得到了一些略微奇怪的行为,想检查一下我是否遗漏了什么。

我正在尝试将www.domain.com以外的任何内容(例如www.domain.netwww.domain.info)重定向到www.domain.com。除了www.domain.de以重定向到www.domain.com/de

我有以下规则:

server {
   server_name domain.de www.domain.de;
   rewrite ^(.*) http://www.domain.com/de$1 permanent;
}

server {
   server_name _;
   rewrite ^(.*) http://www.domain.com$1 permanent;
}

server {
   listen 80;
   server_name localhost domain.com www.domain.com;
   ...
}

但是,似乎使用此规则集,它始终会将所有.com域重定向到www.domain.com/de。然而,如果我翻转前两个server段,它可以正常工作。

我做错了吗?如果明确指定了服务器名称,为什么规则的顺序很重要?

2 个答案:

答案 0 :(得分:2)

使用server_name _;表示'这是默认服务器'是一个常见的错误。它没有特殊含义,您需要使用listen指令上的default_server标志将第二个服务器标记为默认值:

server {
  listen 80 default_server;
  server_name _;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}

答案 1 :(得分:2)

正确的配置是:

server {
   listen 80;
   server_name domain.de www.domain.de;
   return 301 http://www.domain.com/de$request_uri;
}

server {
   listen 80 default_server;
   server_name _;
   return 301 http://www.domain.com$request_uri;
}

server {
   listen 80;
   server_name "" localhost domain.com www.domain.com;
   ...
}

server_name _;只是一个受欢迎的存根。 server_name指令的默认值是“”,它处理没有“Host”头的请求。如果客户端根本没有发送它,那么server_name ""将导致像您这样的配置中的重定向循环。

请看一下: