nginx 配置的server_name参数(转)
转自: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参数(转)的更多相关文章
- nginx 配置的server_name参数
nginx中的server_name指令主要用于配置基于名称虚拟主机. 一 匹配顺序,server_name指令在接到请求后的匹配顺序如下: 1.确切的server_name匹配,例如: server ...
- nginx配置一般优化参数
#user nobody; worker_processes 2; # CPU亲和力,worker_processes最多开启8个,注意写法 worker_cpu_affinity 01 10; wo ...
- nginx配置的server_name无法访问
问题: 我的nginx.conf配置文件中的server_name是这样子的,然后无法访问. 但是如果说server_name后面改成服务器的IP地址却是可以访问的. 解决方案: 在本机上(不是服务器 ...
- nginx配置文件结构
nginx配置文件结构 全局参数 配置系统全局参数如:worker_processes 工作子进程数量.error_log 错误日志路径.pid 进程IDEvent一般是配置nginx工作模式及连 ...
- nginx响应高并发参数配置
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...
- 【nginx】nginx配置文件结构,内置变量及参数调优
Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...
- Nginx 配置及参数详解
Nginx 配置及参数详解 Nginx Location 指令语法 如下就是常用的 location 配置的语法格式,其中modifier是可选的,location_match就是制定 URI 应该去 ...
- Nginx 配置参数中文说明
Nginx配置参数中文详细说明: #定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes ; # #全 ...
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
随机推荐
- h2database源码浅析:SQL语句的执行
最近想好好了解一下数据库的原理,下载了h2database的源码,准备好好看看.此过程的一些想法,暂且记下来,权当做读码笔记吧! 为了调试准备的测试用例: @Test public void test ...
- Android进阶——声波振幅显示
最近博主想做一个app,中间有一个是录音的功能.于是博主想把UI做的好看一些,想仿照微信或者QQ语音输入时,能够随着声音的大小显示声波振幅.于是查找了一些资料,现在把这个功能的Demo分享给大家,以后 ...
- 【小丸类库系列】Word操作类
using Microsoft.Office.Interop.Word; using System; using System.Collections.Generic; using System.Dr ...
- Java实战之03Spring-02Spring的核心之IoC
二.Spring的核心之IoC(Inversion of Control 控制反转) 1.IoC是什么? 回顾:连接池原理中的使用. 注意:我们在连接池原理中是使用构造函数注入的,当然还可以通过提供s ...
- CSU-ACM2016暑假集训训练2-DFS(C - Network Saboteur)
C - Network Saboteur Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu ...
- VC++代码的汇编分析(一)
VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念 ...
- Windows 键盘操作快捷方式积累
复制.粘贴: CTRL+C 复制被选择的项目到剪贴板 CTRL+V 粘贴剪贴板中的内容到当前位置 CTRL+X 剪切被选择的项目到剪贴板 Alt+ space + E + P CMD 窗口快速粘贴 关 ...
- [转]怎样在cmd(命令提示符)下进行复制粘贴操作
原文链接:http://jingyan.baidu.com/article/93f9803fd3a4dde0e46f55f5.html cmd下复制粘贴的快捷操作方式 工具/原料 系统cmd 步骤/方 ...
- 模板:函数memset
需要的头文件 <memory.h> or <string.h> memset 函数介绍 void *memset(void *s, int ch, size_t n); 函 ...
- angular中的orderBy过滤器使用
一 orderBy过滤器 AngularJS中orderBy进行排序,第一个参数可以有三种类型,分别为:function,string,array: 第一种:function,如果是func ...