一、server_name 详解
当Nginx接到请求后,会匹配其配置中的server模块。匹配方法就是靠请求携带的host和port正好对应其配置中的server_name 和listen。如果做过ip和域名绑定,ip和域名二者是对等的。
server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序的优先级分别为:
1、准确的server_name匹配:server { listen 80; server_name domain.com www.domain.com; }
2、以*通配符开始的字符串:server { listen 80; server_name *.domain.com; }
3、以*通配符结束的字符串:server { listen 80; server_name www.*; }
注意: 通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以
www.*.example.org
和w*.example.org
都是非法的。有一种形如
.example.org
的特殊通配符,它可以既匹配确切的名字example.org
,又可以匹配一般的通配符名字*.example.org
4、匹配正则表达式:server { listen 80; server_name ~^(?.+)\.domain\.com$; }
Nginx会按照以上1 > 2 > 3 > 4 的顺序对server name进行匹配(而和配置段本身的排版顺序无关),只要有一项匹配以后就会停止搜索,所以在使用这个指令的时候一定要分清楚它的匹配优先级顺序,与location指令类似。
所以需要注意的是:第一,分清楚匹配优先级顺序;第二,在优先级一样的情况下,需要注意匹配顺序,只要有一项匹配后就会停止搜索的。
二、server_name 应用
server_name指令一项很实用的功能就是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件不利于日常的维护工作。下面是2个具体的应用
1、在一个server块中配置多个站点
server {
listen 80;
server_name ~^(www\.)?(.+)$;
index index.php index.html;
root /data/wwwsite/$2;
}
构建类似如下的站点目录结构,这样就可以只使用一个server块来完成多个站点的配置映射关系。如:/data/wwwsite/biying.com、/data/wwwsite/baidu.com、/data/wwwsite/google.com
可以分析以上server配置段,发现使用了$2,而$2 正是server_name正则表达式【~^(www\.)?(.+)$】的第二个分组。
正则表达式捕获组创建了变量,普通的正则表达式捕获组可以创建$0、$1、…、$9这10个变量。$0表示原串,$1-$9表示第一到第九个匹配组的内容。
2、在一个server块中为一个站点配置多个二级域名
实际网站目录结构中通常会为站点的二级域名独立创建一个目录,同样可以使用正则的捕获来实现在一个server块中配置多个二级域名
server{
listen 80;
server_name ~^(.+)?\.domain\.com$;
index index.html;
if ($host = domain.com){
rewrite ^ http://www.domain.com permanent;
}
root /data/wwwsite/domain.com/$1/;
}
站点的目录结构应该如下:/data/wwwsite/domain.com/www/、/data/wwwsite/domain.com/blog/、/data/wwwsite/domain.com/bbs/
访问www.domain.com时,root目录为 /data/wwwsite/domain.com/www/
blog.domain.com时,为root目录为/data/wwwsite/domain.com/blog/,以此类推。
上面 root 里的 $1 的匹配就是 server_name 里的正则匹配的第一个分组
后面if语句的作用是将domain.com的方位重定向到www.domain.com,这样既解决了网站的主目录访问,又可以增加SEO中对www.domain.com的域名权重。另外,server_name 同样支持使用ip进行匹配。
3、多个正则表达式
如果你在server_name中用了正则,而下面的location字段又使用了正则匹配,这样将无法使用$1,$2这样的引用,解决方法是通过set指令将其赋值给一个命名的变量:
server { listen 80; server_name ~^(.+)?\.sklinux\.com$; set $www_root $1; root /data/wwwsite/sklinux.com/$www_root/; location ~ .*\.php?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwsite/sklinux.com/$fastcgi_script_name; include fastcgi_params; } }