当前位置:首页 > 服务端 > nginx 配置的server_name参数

nginx 配置的server_name参数

2022年11月09日 19:50:14服务端6

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;
         }
   }

 

喜欢这篇文章?欢迎打赏~~

nginx 配置的server_name参数 _ JavaClub全栈架构师技术笔记

 

作者:苍青浪
来源链接:https://www.cnblogs.com/cangqinglang/p/11341981.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/69017.html

标签: Nginx
分享给朋友:

“nginx 配置的server_name参数” 的相关文章

【2022最新Java面试宝典】—— Nginx面试题(23道含答案)

目录 1. 什么是Nginx? 2. 为什么要用Nginx? 3. 为什么Nginx性能这么高? 4. Nginx怎么处理请求的? 5. 什么是...

解决nginx proxy

为什么cookie 会丢失? 比如说一个没有经过代理的地址 : http://127.0.0.1/project cookie_path:/project 如果按照第二种方式代理 那么地址就是 : http://127.0.0.1/proxy_p...

nginx 反向代理web应用将https请求转成http请求时,必须注意事项

通过nginx可以实现将https请求转成http请求。具体方法这里暂且不表。 但有一项配置必须要添加(查看大多数配置均为对此进行提及): proxy_set_header WL-Proxy-SSL true; //weblogic启效 pro...

linux 安装docker 并使用docker 安装nginx

linux 安装docker 并使用docker 安装nginx

    啊 , 感叹下,生活不会亏待努力的人(虽然我不是  嘻嘻),但是一直过着 聪明、健康、有爱的生活。。。。。。。。。。。。。。。    之前也在linux下安装过docker,并且也一直使用,但是一直没有记录下安装的过...

修改nginx对http请求数据大小限制

修改nginx对http请求数据大小限制

原文地址:https://blog.csdn.net/u014225733/article/details/80811128 主要实现的功能如下: 主要是测试图片的二进制流,通过http的post请求,上传本地图片,在部署服务中,已经将http请求大小限...

Java高级架构师(一)第32节:Nginx的进程结构、基本配置

Java高级架构师(一)第32节:Nginx的进程结构、基本配置

核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁。   作者:Mars、少年 来源链接:https://www.cnblogs.com/sunrunzhi/p/102...

使用docker安装nginx

使用docker安装nginx

一、获取nginx镜像 1.获取nginx镜像列表 docker search nginx 2.拉取nginx镜像到本地(注:默认选取官方最新镜像),其它版本可以去DockerHub查询 docker pull nginx...

Java高级架构师(一)第33节:Nginx常用核心模块指令

Java高级架构师(一)第33节:Nginx常用核心模块指令

error_log:错误日志级别 http://www.nginx.cn/doc/  Nginx中文文档   # 并发总数是 worker_processes 和 worker_connections 的乘积 # 即 max_client...

nginx虚拟主机配置

nginx虚拟主机配置

新版本nginx的配置文件被拆分为若干部分 1、主配置文件为nginx.conf 2、与php相关的是fastcgi_params 3、与python相关的是uwsgi_params 4、...其他配置文件 [PS:首先确保占用80端口的服务被停止,ngi...

Nginx:Nginx配置文件详解

Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。 如下是Nginx的配置详解: ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。