0

我正在使用server和玩弄 nginx 重写规则server_name。关于优先顺序,文档听起来很简单和清楚,但我得到了一些有点奇怪的行为,并想检查我是否遗漏了任何东西。

我正在尝试将除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部分,它工作正常。

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

4

2 回答 2

2

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

server {
  listen 80 default_server;
  server_name _;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
于 2012-05-15T12:31:00.093 回答
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 ""将导致像您这样的配置中的重定向循环。

请看一下:

于 2012-05-15T15:02:31.767 回答