转自:http://www.sklinux.com/373

nginx中的server_name指令主要用于配置基于名称虚拟主机.

一 匹配顺序,server_name指令在接到请求后的匹配顺序如下:

1、确切的server_name匹配,例如:

server {
listen ;
server_name www.sklinux.com sklinux.com;
...
}

2、以*通配符开始的最长字符串:

server {
listen ;
server_name *.sklinux.com;
...
}

3、以*通配符结束的最长字符串:

server {
listen ;
server_name www.*;
...
}

注意: 通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“www.*.example.org”和“w*.example.org”都是非法的。

有一种形  如“.example.org”的特殊通配符,它可以既匹配确切的名字“example.org”,又可以匹配一般的通配符名字“*.example.org”。

4、匹配正则表达式:

server {
listen ;
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 ;
server_name ~^(www\.)?(.+)$;
index index.php index.html;
root /data/wwwsite/$;
}

站点的主目录应该类似于下面的结构,这样就可以只使用一个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 ;
server_name ~^(.+)?\.sklinux\.com$;
index index.html;
if ($host = sklinux.com){
rewrite ^ http://www.sklinux.com permanent;
}
root /data/wwwsite/sklinux.com/$/;
}

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

/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 ;
server_name ~^(.+)?\.sklinux\.com$;
set $www_root $;
root /data/wwwsite/sklinux.com/$www_root/;
location ~ .*\.php?$ {
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwsite/sklinux.com/$fastcgi_script_name;
include fastcgi_params;
}
}

nginx 配置的server_name参数(转)的更多相关文章

  1. nginx 配置的server_name参数

    nginx中的server_name指令主要用于配置基于名称虚拟主机. 一 匹配顺序,server_name指令在接到请求后的匹配顺序如下: 1.确切的server_name匹配,例如: server ...

  2. nginx配置一般优化参数

    #user nobody; worker_processes 2; # CPU亲和力,worker_processes最多开启8个,注意写法 worker_cpu_affinity 01 10; wo ...

  3. nginx配置的server_name无法访问

    问题: 我的nginx.conf配置文件中的server_name是这样子的,然后无法访问. 但是如果说server_name后面改成服务器的IP地址却是可以访问的. 解决方案: 在本机上(不是服务器 ...

  4. nginx配置文件结构

    nginx配置文件结构   全局参数 配置系统全局参数如:worker_processes 工作子进程数量.error_log 错误日志路径.pid 进程IDEvent一般是配置nginx工作模式及连 ...

  5. nginx响应高并发参数配置

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  6. 【nginx】nginx配置文件结构,内置变量及参数调优

    Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...

  7. Nginx 配置及参数详解

    Nginx 配置及参数详解 Nginx Location 指令语法 如下就是常用的 location 配置的语法格式,其中modifier是可选的,location_match就是制定 URI 应该去 ...

  8. Nginx 配置参数中文说明

    Nginx配置参数中文详细说明: #定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes ; # #全 ...

  9. Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.nginx 原理与优化参数配置 ​ ​ master-workers 的机制的好处 首先,对于每个 ...

随机推荐

  1. 提高查询速度:SQL Server数据库优化方案

    查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...

  2. UIMenuController/UIPasteboard(1) 制作一个可以粘贴复制的Label

    效果如下:   苹果只放出来了 UITextView,UITextField,webView三个控件的剪贴板,所以我们要自定义可以复制粘贴的控件,首先需要打开UIResponder的两个方法: - ( ...

  3. IOS-用动画组制作花瓣掉落效果(另附iOS动画图表)

    重要的两个方法:1.动画的数组:animations 2.启动的时间 beginTime 注意:动画组设置了持续时间(duration)可能会导致动画组里面的持续时间不管用 代码如下: #import ...

  4. HDU 4764 Stone(博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 题目大意:Tang和Jiang玩石子游戏,给定n个石子,每次取[1,k]个石子,最先取完的人失败 ...

  5. 使用qt制作简单的加法,乘法运算。

    1.首先构架qt应用项目 2.然后打开使用 Qt desinger打开 Fomr File 里的UI文件进行编辑 3.由于此程序只需点击加号,减号这两个按钮,所以设置了两个信号槽 4.然后是连接信号槽 ...

  6. C++里的int 和string类型相互转换

    C++不像Java和C#一样在进行数据类型转换时直接调用一些类方法就可以了,使用起来很简单. 一个很简单的例子就是string str=“D:\\”+1+“.txt”;这在Java或者C#里面是可以自 ...

  7. 九度OJ 1534 数组中第K小的数字 -- 二分查找

    题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...

  8. 实习笔记-1:sql 2008r2 如何创建定时作业

    在公司实习了近一个月,学了很多东西.这一篇是一些比较基础的东西,本人是小菜鸟,不喜欢大神来喷.大神欢迎出门点右上角.谢谢~ 说大实话,对于数据库,我在还没出来实习的时候就是只懂写一些sql语句以及知道 ...

  9. php 二维转一维

    Array(    [0] => Array        (            [salesorderid] => 10001            [createdtime] =& ...

  10. top每个参数的意义

    上图来源于本人虚拟机,作为每个参数解释的参考 10:32:20:现在的时间 up 1 min : 服务器运行的时长 1 user:现在只有1个用户登录 load average: 0.74, 0.25 ...