nginx 配置的server_name参数(转)
nginx 配置的server_name参数(转)
转自:http://www.sklinux.com/373
nginx中的server_name指令主要用于配置基于名称虚拟主机.
一 匹配顺序,server_name指令在接到请求后的匹配顺序如下:
1、确切的server_name匹配,例如:
server { listen 80; server_name www.sklinux.com sklinux.com; ... }
2、以*通配符开始的最长字符串:
server { listen 80; server_name *.sklinux.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 ~^(?<www>.+)\.sklinux\.com$; ... }
nginx将按照1,2,3,4顺序对server name进行匹配(而和配置段本身的排版顺序无关),只要有一项匹配以后就会停止搜索。
二。 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、$1、…、$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; } }
相关文章
- 如果SQL Server 配置管理器没有找到就代表安装失败?
- Nginx配置文件(nginx.conf)配置详解
- Spring Cloud Bus集成Spring Cloud Config Server实现全局配置的自动刷新(一)
- 集群配置:SQL Server 2016 Alwayson集群新增功能详解
- 集群配置:SQL Server Alwayson集群创建代理作业的注意事项
- SQL Server 获取服务器时间的sql语句
- 配置SQL Server数据库恢复模式(2种方法)
- SQL Server安装完成后3个需要立即修改的配置选项
- MyEclipse server窗口 Could not create the view: An unexpected exception was thrown 错误解决详解程序员
- SQL Server如何通过SQL语句直接操作另一台服务器上的SQL SERVER的数据
- Oracle 参数 RDBMS_SERVER_DN 官方解释,作用,如何配置最优化建议
- Oracle 参数 SHARED_SERVER_SESSIONS 官方解释,作用,如何配置最优化建议
- MySQL Variables collation_server 数据库 参数变量解释及正确配置使用
- 配置SQL Server 2012快速安装与配置指南(sqlserver2012安装)
- 打开SQL Server端口开放:配置实现快速连接(sqlserver端口)
- 使用SQL Server配置管理表(sqlserver配置表)
- SQL Server上实现表配置技巧(sqlserver设置表)
- 全面理解 SQL Server 配置指南(sqlserver的配置)
- 管理SQL Server内存管理:实现高效运行(sqlserver的内存)
- SQL Server握手:建立可靠的网络连接(sqlserver握手)
- 锁 SQL Server中的排他锁:最佳实践(sqlserver 排他)
- SQL Server中平方根的计算之路(sqlserver平方根)
- 使用 SQL Server 技术实现数据匹配功能(sqlserver 匹配)
- 如何快速配置SQL Server环境(配置下sqlserver)