nginx server_name配置

nginx 中的 server_name 指令主要用于配置基于名称的虚拟主机,server_name 指令在接到请求后的匹配顺序分别为:

  • 1.精确匹配
server {  
     listen       80;
     server_name  sherlocky.com  www.sherlocky.com;
     ...
}
  • 2.通配符开始匹配
server {  
     listen       80;
     server_name  *.sherlocky.com;
     ...
}
  • 3.通配符结束匹配
server {  
     listen       80;
     server_name  www.*;
     ...
}
  • 4.正则表达式匹配
server {  
     listen       80;
     server_name  ~^(?.+)\.sherlocky\.com$;
     ...
}

nginx 将按照 1, 2, 3, 4 的顺序对 server name 进行匹配,只有有一项匹配以后就会停止搜索(类似于 location 指令)。

利用 server_name 指令正则表达式的捕获功能,可以尽量精简配置文件。
such as:

  • 1.在一个 server 块中配置多个站点:
server {  
     listen       80;
     server_name  ~^(www\.)?(.+)$;
     index index.php index.html;
     root  /data/www/$2;
}

站点的主目录应该类似于这样的结构:

/data/www/sherlocky.com
/data/www/nginx.org
/data/www/google.com

这样就可以只使用一个 server 块来完成多个站点的配置。

  • 2.在一个 server 块中为一个站点配置多个二级域名

实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录

server {  
     listen       80;
     server_name  ~^(.+)?\.sherlocky\.com$;
     index index.html;
     if ($host = sherlocky.com){
         rewrite ^ http://www.sherlocky.com permanent;
     }
     root  /data/www/sherlocky.com/$1/;
}

站点的目录结构应该如下:

/data/www/sherlocky.com/www/
/data/www/sherlocky
.com/nginx/

这样访问 www.sherlocky.comroot 目录为 /data/www/sherlocky.com/www/
访问nginx.sherlocky.com时为 /data/www/sherlocky.com/nginx/,以此类推。

if 语句的作用是将 sherlocky.com 重定向到 www.sherlocky.com,这样既解决了网站的主目录访问,又可以增加 seo 中对 www.sherlocky.com 的域名权重。