转自:http://www.sklinux.com/373php
nginx中的server_name指令主要用于配置基于名称虚拟主机.html
一 匹配顺序,server_name指令在接到请求后的匹配顺序以下:linux
一、确切的server_name匹配,例如:nginx
server { listen 80; server_name www.sklinux.com sklinux.com; ... }
二、以*通配符开始的最长字符串:正则表达式
server { listen 80; server_name *.sklinux.com; ... }
三、以*通配符结束的最长字符串:dom
server { listen 80; server_name www.*; ... }
注意: 通配符名字只能够在名字的起始处或结尾处包含一个星号,而且星号与其余字符之间用点分隔。因此,“www.*.example.org
”和“w*.example.org
”都是非法的。学习
有一种形 如“.example.org
”的特殊通配符,它能够既匹配确切的名字“example.org
”,又能够匹配通常的通配符名字“*.example.org
”。网站
四、匹配正则表达式:google
server { listen 80; server_name ~^(?<www>.+)\.sklinux\.com$; ... }
nginx将按照1,2,3,4顺序对server name进行匹配(而和配置段自己的排版顺序无关),只要有一项匹配之后就会中止搜索。.net
二。 server_name指令的正则表达式应用
server_name指令一项很实用的功能即是能够在使用正则表达式的捕获功能.nginx使用的正则表达式兼容PCRE。
为了使用正则表达式,虚拟主机名必须以波浪线“~”起始不然该名字会被认为是个确切的名字:
server_name ~^www\d+\.example\.net$;
若是表达式含星号,则会被认为是个通配符名字(并且极可能是一个非法的通配符名字)。不要忘记设置“^
”和“$
”锚点,
语法上它们不是必须的,可是逻辑上是的。同时须要注意的是,域 名中的点“.”须要用反斜线“\”转义。含有“{
”和“}
”的正则
表达式须要被引用,如:
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
不然nginx就不能启动,错误提示是:
directive "server_name" is not terminated by ";" in ...
命名的正则表达式捕获组在后面能够做为变量使用:
server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; } }
PCRE使用下面语法支持命名捕获组:
?<
name
>从PCRE-7.0开始支持,兼容Perl 5.10语法 ?'
name
'从PCRE-7.0开始支持,兼容Perl 5.10语法 ?P<
name
>从PCRE-4.0开始支持,兼容Python语法
若是nginx不能启动,并显示错误信息:
pcre_compile() failed: unrecognized character after (?< in ...
说明PCRE版本太旧,应该尝试使用?P<name>
。捕获组也能够以数字方式引用:
server { server_name ~^(www\.)?(.+)$; location / { root /sites/$2; } }
不过,这种用法只限于简单的状况(好比上面的例子),由于数字引用很容易被覆盖。
下面是2个具体的应用:
1. 在一个server块中配置多个站点
server { listen 80; server_name ~^(www\.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; }
站点的主目录应该相似于下面的结构,这样就能够只使用一个server块来完成多个站点的配置。
/data/wwwsite/sklinux.com /data/wwwsite/baidu.com /data/wwwsite/sina.com /data/wwwsite/google.com
本例中正则表达式捕获组建立了变量,普通的正则表达式捕获组能够建立$0、$一、…、$9这10个变量。$0表示原串,$1-$9表示第一到第九个匹配组的内容。
2. 在一个server块中为一个站点配置多个二级域名
实际网站目录结构中咱们一般会为站点的二级域名独立建立一个目录,一样咱们可使用正则的捕获来实如今一个server块中配置多个二级域名:
server { listen 80; server_name ~^(.+)?\.sklinux\.com$; index index.html; if ($host = sklinux.com){ rewrite ^ http://www.sklinux.com permanent; } root /data/wwwsite/sklinux.com/$1/; }
站点的目录结构应该以下:
/data/wwwsite/sklinux.com/www/ /data/wwwsite/sklinux.com/nginx/
这样Root目录和目标HOST地址的对应关系以下:
http://www.sklinux.com <--> /data/wwwsite/sklinux.com/www/ http://nginx.sklinux.com <--> /data/wwwsite/sklinux.com/nginx/
后面if语句的做用是将sklinux.com的方位重定向到http://www.sklinux.com,这样既解决了网站的主目录访问,又能够增长seo中对http://www.sklinux.com的域名权重。
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; } }
持续学习、持续收获才能带来持续的知足和快乐!