前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx server_name和location匹配规则

Nginx server_name和location匹配规则

原创
作者头像
用户4046016
修改2021-04-19 11:51:14
7.6K0
修改2021-04-19 11:51:14
举报
文章被收录于专栏:Rick

一、server_name匹配规则

1、Nginx的server_name匹配规则

①匹配IP地址和listen指令指定的IP和端口;

②将Host头字段作为字符串匹配server_name指令;

③将Host头字段与server_name指令值字符串的开始部分做匹配;

④将Host头字段与server_name指令值字符串的结尾部分做匹配;

⑤将Host头字段与server_name指令值进行正则表达式匹配;

⑥如果所有Host头匹配失败,那么将会转向listen指令标记的default server;

⑦如果所有Host头匹配失败,并且没有default_server,那么将会转向满足第一步的第一个server的listen指令。

2、server_name 格式

①精确匹配

server_name www.xuegod.cn

②泛解析

server_name *.xuegod.cn; #替代部分子域名

server_name www.xuegod.*; #替代部分顶级域

③正则表达式匹配

#注意:正则匹配时~和要匹配的字符不要带空格,和location匹配有点区别

server_name ~^www\.example\.com$;

server_name ~^www(\d+)\ .example\.(com)$ ;

server_name ~^.*\.xuegod\.cn$; #以任何字符开头并xuegod.cn结尾的URL

④默认server

server_name localhost;

⑤拓展生产中应用

server_name ~^.*h5-pre\.edsmall\.com$;

return 301 https://$host$request_uri; #注意使用正则匹配servername时这里强制跳转就要用host,而不用server_name

3、虚拟主机

①虚拟主机作用

在同一台服务器上部署多个网站,减免资源的占用

②实现方式

方式1、不同IP,相同端口,不同域名;

需要两个公网IP地址,两个域名

方式2、相同IP,相同端口,不同域名;(不同域名,监听同一个端口)

需要一个公网IP地址,两个域名

方式3、相同IP,相同域名,不同端口;

需要一个公网IP地址,一个域名

#显然最后一种方式最节约成本

4、拓展丢弃无host字段的请求

server { listen 80; server_name ""; return 444; }

5、不同监听端口各自有default_server

Note that the default server is a property of the listen port and not of the server name. More about this later.

6、host未空时的响应

二、location匹配规则

1、Nginx的location匹配规则

①如果命中精确匹配,则优先精确匹配,并终止匹配;

②如果命中多个前缀匹配,则记住最长的前缀匹配,并继续匹配;

③如果最长的前缀匹配是优先前缀匹配,则命中此最长的优先前缀匹配,并终止匹配;

④如果最长的前缀匹配是非优先前缀匹配,并且命中多个正则匹配,使用第一个命中的正则匹配,并终止匹配。否则匹配最长的前缀匹配,终止匹配。

#注意location是没有默认location的,不管是后端还是proxy,没有找到对应的location就会返回404页面。(这里特别注意根“/”会匹配到所有,做proxy如果对跟“/”匹配到都给后端,那么404错误码是后端抛出的)

2、location匹配规则详解

①精确匹配

方法1、等号为精确匹配

location = / #匹配到了马上停止匹配,如果一个网站访问这个比较多,可以提高访问速度

方法2、另一种精确匹配(完整的URI)

location /data/image.html #隐式的精确匹配

②模糊匹配

location /synchrony #模糊匹配,URI里已/synchrony开头的,已验证

例1、http://localhost/synchrony/app/index.html

例2、http://localhost/synchrony-pass/index.html

location ^~ / #指的非正则匹配,意思当被选为最长普通匹配时,就不要匹配正则了(我当老大了就没正则什么事了)

③正则匹配

区分大小写

location ~

④正则匹配,但是不区分大小写

location ~* \.TXT$

⑤命名location

location @fallback #不是用来处理普通的HTTP请求的,专门用来内部重定向的(仅对内部访问重定向)

#在server上下文中配置

error_page 404 = @fallback;

location @fallback {

proxy_pass http://www.nginx.org;

}

#当访问不存在的http://192.168.7.3/en/ 时将会重定向到http://www.nginx.org/en/

3、总结location匹配规则

正则 location 匹配让步普通location 的严格精确匹配结果;但覆盖普通 location 的最大前缀匹配结果

4、规则顺序示例

假设当前配置是:location /exact/match/test.html { 配置指令块1},location /prefix/ { 配置指令块2} 和 location ~ \.html$ { 配置指令块3} ,如果我们请求 GET /prefix/index.html ,则会被匹配到指令块3 ,因为普通location /prefix/ 依据最大匹配原则能匹配当前请求,但是会被后面的正则location 覆盖;当请求GET /exact/match/test.html ,会匹配到指令块1 ,因为这个是普通location 的exact match ,会禁止继续搜索正则location 。

5、拓展location嵌套

location /htdocs {

alias /usr/share/phpldapadmin/htdocs;

index index.php;

location ~ \.php$ {

alias /usr/share/phpldapadmin;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

6、拓展Nginx分离location

7、localtion优先级案例

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、server_name匹配规则
    • 1、Nginx的server_name匹配规则
      • 2、server_name 格式
        • 3、虚拟主机
          • 4、拓展丢弃无host字段的请求
            • 5、不同监听端口各自有default_server
              • 6、host未空时的响应
              • 二、location匹配规则
                • 1、Nginx的location匹配规则
                  • 2、location匹配规则详解
                    • 3、总结location匹配规则
                      • 4、规则顺序示例
                        • 5、拓展location嵌套
                        相关产品与服务
                        弹性公网 IP
                        弹性公网 IP(Elastic IP,EIP)是可以独立购买和持有,且在某个地域下固定不变的公网 IP 地址,可以与 CVM、NAT 网关、弹性网卡和高可用虚拟 IP 等云资源绑定,提供访问公网和被公网访问能力;还可与云资源的生命周期解耦合,单独进行操作;同时提供多种计费模式,您可以根据业务特点灵活选择,以降低公网成本。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档