Nginx-基础-基础配置(Server,Location语法,匹配优先级,rewrite)

请求定位(Server模块)

nginx有两层指令来匹配请求 URL

  • 第一个层次是 server 指令,它通过域名、ip和端口来做第一层级匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。
  • 第二个层次是location指令,它通过请求uri来做第二层匹配。
    1 示范例子
server {
    listen       81; # 监听的端口
    server_name  localhost; # 域名或ip
    
    location / {  # 访问路径配置
        return 400;
    }
    location /xx/xx {  # 访问路径配置
        return 402;
    }

}
server {
    listen       82; # 监听的端口
    server_name  localhost; # 域名或ip
    
    location / {  # 访问路径配置
        return 401;
    }  
}

注解:每一个端口为一个Server,用于做不同的事情。

补充知识点:
域名访问
1) windows
C:\Windows\System32\drivers\etc\hosts 在这个目录下增加域名与ip的映射
2) linux
/etc/hosts 在这个目录下增加域名和ip的映射关系

2 基于域名的例子

 server {
    listen 82;
    server_name www.liyong.f.com;
    location / {
        return 401;   
    }
}
server {
    listen 83;
    server_name www.liyong.s.com;
    location / { 
        return 402;
    }
}

然后再服务客户端配置域名ip映射,windows和linux配置文件不同参考上面的路径。
访问:http://www.liyong.s.com:83/ http://www.liyong.f.com:82/

请求定位(Location )

每个server块中可以包含多个location块。location块的主要作用是,基于nginx服务器接收到的客户端发送过来的请求uri(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。
地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。

location 语法
location [ = | ~ | ~* | ^~ ] /uri { #配置location可以配置的属性 } #[] 里面的意思是多种写法 | 表示或 不要错误的理解为location的配置还有[] 里面配一串之类的 实际配置 location =,  location ^~ 是这样的

location匹配参数解释

参数匹配方式匹配模式说明注意事项
=精准匹配普通字符串匹配用于标准uri前,要求请求字符串与uri精准匹配,成功则立即处理,nginx停止搜索其他匹配。
~正则匹配正则表达式匹配用于正则uri,表示uri包含正则表达式,并且区分大小写。如果uri包含正则表达式,就必须要使用“~”或者“~*”标识。
~*正则表达式匹配用于正则uri,表示uri包含正则表达式,并且不区分大小写。
^~带参前缀匹配 (短路匹配)普通字符串匹配用于标准uri前,并要求一旦匹配到就会立即处理,不再去匹配其他的正则URI,一般用来匹配目录。
普通前缀匹配普通字符串匹配location后没有参数直接跟着标准uri,表示前缀匹配,代表跟请求中的uri从头开始匹配。

location匹配顺序
location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求URI 会按如下规则进行匹配,优先级从高到低依次为(序号越小优先级越高):

1. location =    # 精准匹配,精准匹配成功则会立即停止其他类型匹配;
2. location ^~   # 带参前缀匹配。如果是带有 ^~ 的前缀匹配,匹配成功则立即停止其他类型匹配;如果是普通前缀匹配(不带参数 ^~ )成功则会暂存,继续查找正则匹配;
3. location ~    # 正则匹配(区分大小写)。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配;
4. location ~*   # 正则匹配(不区分大小写)
5. location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数 ^~ )结果。普通字符串匹配则无视顺序,只会选择最精确的匹配。
6. location /    # 任何没有匹配成功的,都会匹配这里处理
location 匹配规则优先级验证

1 通用匹配
相当于是兜底处理,所有的规则匹配不成功就会走兜底处理。

server {
      listen 82;
      server_name www.liyong.f.com;
       # 因为所有的地址都以 /开头,所以这条规则将匹配到所有请求,比如访问 / 和 /testOrder , 则 / 匹配 /data,/test也匹配,
      location / { #作为最后的匹配项
        return 401;
      }
      location /testOrder { #普通前缀匹配
        root html;
        index index.html 
      }
  }

访问:
http://www.liyong.f.com:82/data,http://www.liyong.f.com:82/test 都是401
访问testOrder 会走下面的匹配 其实它也是能匹配上/的,但是/testOrder优先级更高就会去服务器相对路径/html/testOrder/寻找资源。
在这里插入图片描述
同时通过上面的例子也验证了,匹配与location的书写顺序无关。如果有关就会被/ 先匹配。
2 普通前缀匹配
就是根据普通路径进行匹配,非等值匹配匹配最长的路径。

server {
   listen 82;
   server_name www.liyong.f.com;
   location /doc {
       return 402;
   }
   location /docu {
       return 500;
   }
}

访问:http://www.liyong.f.com:82/document
在这里插入图片描述
说明:前缀匹配下,返回最长匹配的 location,与 location 所在配置文件中的顺序无关。
3 正则匹配
3.1 正则匹配与普通匹配

location ~ ^/proxy { #正则匹配
    return 500;
}
location /proxy { #普通匹配
    return 410;
}

访问:http://www.liyong.f.com:82/proxy 可以发现 正则匹配的优先级更高
在这里插入图片描述
3.2 正则匹配与正则匹配

location ~ ^/proxy[0-9]+ {
   return 500;
}
location ~ ^/proxy[0-9]+ {
   return 401;
}

访问:http://www.liyong.f.com:82/proxy114445
在这里插入图片描述
但是如果我们交换顺序:

location ~ ^/proxy[0-9]+ {
   return 401;
}
location ~ ^/proxy[0-9]+ {
   return 500;
}

访问:http://www.liyong.f.com:82/proxy114445
在这里插入图片描述
说明:通过上面的案例可以看到,如果路径满足多个正则,则配置顺序决定了优先级,在前面location会匹配成功。
3.3 区分大小写的正则匹配

server {
    listen 82;
    server_name www.liyong.f.com;
    location ~ /doc{
        return 401;
    }

    location ~* /doc { #正则匹配区分大小写
        return 402;
    }
}

访问: www.liyong.f.com:82/DOC 402
访问 :www.liyong.f.com:82/doc 401
4 带参前缀匹配
4.1 多个带参前缀与正则的优先级

server {
    listen 82;
    server_name www.liyong.f.com;
    location ^~ /doc {
        return 401;
    }
    location ^~ /document {
        return 402;
    }
    location ~ /document {
        return 500;
    }
}

http://www.liyong.f.com:82/document
在这里插入图片描述
说明:都是带参的情况下也是会匹配最长路径,但是这点和正则不同,正则是谁先成功就就走谁。而且我们后面还配了一个路径更长的正则匹配确没有走,证实了带参前缀匹配 ^~ 命中以后会再搜寻其他带参前缀匹配,不会搜索正则匹配。

5 精准匹配
5.1 多个精准匹配

location = /doc {
  return 401; 
}
location = /document {
  return 402; 
}

精准匹配:
只有访问http://www.liyong.f.com:82/doc,http://www.liyong.f.com:82/document 才能正确处理。也就是路径必须一模一样。

5.2 精准匹配与带参前缀匹配

location ^~ /document {
    return 402;
}
             
location = / {
    return 400;
}

location = /document {
    return 401;
}

访问:/document 返回401 所以精准匹配的优先级高于带参匹配

location配置运用的几个准则

1 第一个必选规则

  • 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
  • 可以是一个静态首页,也可以直接转发给后端应用服务器
location = /index.html {
     root   html
     index  index.html index.htm
 }
 
 location = / {
     root   html
     index  index.html index.htm
 }

2 第二个必选规则
处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
   root /webroot/static/;
}
location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
   root /webroot/res/;
}

3 通用匹配,作为兜底

location / {
    return 500;
}
location 的其它配置项

1 匹配问号后的参数

请求 URI 中问号后面的参数是不能在 location 中匹配到的,这些参数存储在 $query_string 变量中,可以用 if 来判断。

location /idx {

  if ($query_string ~* ".*id.*" ) {
     return 500;
  }
  return 401;
}

访问:http://www.liyong.s.com:83/idx?jdid 500
访问:http://www.liyong.s.com:83/idx?xx 401
2 URI 结尾带不带/
1)在location 中配置的URI有没有 / 都没有影响。也就是说 /user//user 是一样的。
2)如果浏览中发送的 URI 结构是 https://domain.com/ 的形式,尾部有没有 / 都不会造成重定向。因为浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 / 。这一点,可以访问baidu验证一下。
3)如果浏览中发送的 URI 结构是 https://domain.com/``some-dir/ 。尾部如果缺少 / 将导致重定向。因为根据约定,URI 尾部有 / 表示目录,没有 / 表示文件。
a. 所以访问 /some-dir/ 时,服务器会自动去该目录下找对应的默认文件。
b. 如果访问 /some-dir 的话,服务器会先去找 some-dir 文件,找不到的话会将 some-dir 当成目录,重定向到 /some-dir/ ,去该目录下找默认文件。

rewrite指令

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

  • rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用。

rewrite 跳转实现

  • nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支 持 else。

  • 另外该模块需要 PCRE 支持,应在编译 nginx 时指定 PCRE 支持,默认已经安装。

  • 根据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样 的循环最多可以执行 10 次,超过后 nginx 将返回 500 错误。
    rewrite 执行顺序

  • 执行 server 块里面的 rewrite 指令。

  • 执行 location 匹配。

  • 执行选定的 location 中的 rewrite 指令。

flag标记说明

  • last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 serverif 中。
  • break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
  • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
  • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
示范例子

1 重新定向到nginx中的路径

server {
listen 82;
server_name www.liyong.f.com;
    location / {
        # 判断主机名为www.itxh.com则重写为www.newitxh.com
        if ($host = 'www.liyong.f.com'){
            rewrite ^/(.*)/(.*)$ /demo/$2 permanent; #这里$2 表示第二个括号的内容
        }
        root   html;
        index  index.html index.htm;
    }
    location /demo/aaa {
       alias html;
       index index.html index.htm;
    }
}

访问:http://www.liyong.f.com:82/test/aaa 可以看到被重新定向
结合这个uri解释一下$2 这个$2就是aaa,如果我们写$1则值是test
在这里插入图片描述
拓展:

location /test/ {
    # 判断主机名为www.itxh.com则重写为www.newitxh.com
    if ($host = 'www.liyong.f.com'){
        rewrite ^/(.*)/(.*)$ /demo/$2 permanent;
    }
    root   html;
    index  index.html index.htm;
}
location /demo/aaa {
   alias html;
   index index.html index.htm;
}

这个时候我们访问路径:http://www.liyong.f.com:82/test/test/aaa 才能狗重定向到 /demo/aaa 。由此我们验证了rewrite 后面的正则表达式^/(.)/(.)$是不包含location的路径的,是除去location路径向后匹配。就比如http://www.liyong.f.com:82/test/aaa/bbb被重定向以后是http://www.liyong.f.com:82/demo/bbb
2 基于域名的跳转

 rewrite ^/(.*)$ http://www.liyong.demo.com/$1 permanent;

3 结合ip 或者其它内置变量使用(以ip为例子)
错误配置并且浏览器会缓存重定向,如果你修改了nginx配置发现依然重定向到之前的地址,可以清空浏览缓存试试。
在这里插入图片描述

server {
      listen 82; 
      server_name www.liyong.f.com;
      set $is_rewrite false; 
      if ($remote_addr = '15.195.14.17') {
          set $is_rewrite  true;
      }
      if ($is_rewrite = true) {
         rewrite (.+) /demo/aaa permanent ;
       }
       location /test/ {
           if ($host = 'www.liyong.f.com'){
               add_header X-Remote-Addr  $remote_addr;
               rewrite ^/(.*)/(.*)$ /demo/$2 permanent;
           }
           root   html;
           index  index.html index.htm;
       }
       location /demo/aaa {
          alias html;
          index index.html index.htm;
       }
  }

这个配置会导致死循环,这个是实战中一定要注意的,但是实际上重定向超过一定次数也就不会再发送请求到nginx了,会报错误重定向次数过多
正确的配置:

 server {
     listen       80;
     server_name  localhost;     
 
     # 设置变量为$rewrite,变量值为boolean类型的true
     set $rewrite true;        
     # 当客户端IP为15.195.14.17时,将$rewrite变量值设为false              
     if ($remote_addr = "15.195.14.17"){       
         set $rewrite false;
     }
     # 当变量值为true时,进行rewrite重写,将域名后面的路径重写为/weihu.html
     if ($rewrite = true){                       
         rewrite (.+) /weihu.html;               
     }
     
     # 精确匹配/weihu.html请求
     location = /weihu.html {
         # 看到400页面,就表示重定向成功了
         return 400;                    
     }
     location / {
         return 401;
     }
 }

4 基于参数匹配的跳转
4.1

 server {
     listen       80;
     server_name  localhost;    
     #正则匹配成功就跳转
     if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
         rewrite (.+) http://www.liyong.com permanent;
     }
     
     location / {
         return 400;
     }
 
 }

4.2

 server {
     listen       80;
     server_name localhost;
 
     location ~* ^/abc/123.html {
         rewrite (.+) http://www.liyong.com permanent
     }
     
     location / {
         return 400;
     }
 }

4.3

 server {
     listen       80;
     server_name  localhost;
 
     location ~* ^/abc/123.html {
         rewrite (.+) http://www.liyong.com permanent
     }
     
     location / {
         return 400;
     }
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/140867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“谐波”分析治理,电能质量在线监测

安科瑞 崔丽洁 摘要:在国家鼓励半导体材料国产化的政策导向下,本土半导体材料厂商不断提升半导体产品技术水平和研发能力,逐渐打破了国外半导体厂商的垄断格局,推进中国半导体材料国产化进程,促进中国半导体行业的发展…

ssm826基于ssm的电影评论系统+vue

ssm826基于ssm的电影评论系统vue 交流学习 ​​​​​​​ 演示 项目功能演示: ————————————————

C语言-for循环入门代码

#include <stdio.h>int main() {int count;for (count 0; count < 10; count){printf("1\n");}system("pause");return 0; }1 1 1 1 1 1 1 1 1 1 请按任意键继续. . .灵活的for循环 死循环 while(1) {... }#include <stdio.h> int main(…

【ArcGIS Pro微课1000例】0030:ArcGIS Pro中自带晕渲地貌工具的妙用

在ArcGIS中,制作地貌晕渲效果通常的做法是先制作山体阴影效果,然后叠加在DEM的下面,再改变DEM的透明度来实现。而在ArcGIS Pro中自带了效果显著的晕渲地貌工具。 文章目录 一、晕渲地貌工具1. 符号系统2. 栅格函数二、山体阴影效果1. 工具箱2. 栅格函数打开ArcGIS Pro3.0,加…

对红黑树的理解与实现(C++实现)

认识红黑树 在看到此篇文章之前最好还是先了解一下左右旋也就是AVL树的插入数据该如何处理。AVL树的插入详解-CSDN博客 红黑树&#xff0c;也属于是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是红色&#xff08;red&#xff09;…

基于ssm+vue协同过滤算法的电影推荐系统

基于ssmvue协同过滤算法的电影推荐系统 摘要 电影推荐系统在信息技术发展的背景下日益成为研究的焦点&#xff0c;本研究基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架与Vue.js技术&#xff0c;以协同过滤算法为核心&#xff0c;旨在构建一种高效、准确的电影…

第28章_mysql缓存策略

文章目录 MySQL缓存方案目的分析缓存层作用举例 缓存方案选择场景分析 提升MySQL访问性能的方式MySQL主从复制读写分离连接池异步连接 缓存方案缓存和MySQL一致性状态分析制定读写策略 同步方案canalgo-mysql-transfer 缓存方案的故障问题及解决缓存穿透缓存击穿缓存雪崩缓存方…

nodejs express vue uniapp电影购票系统源码

开发技术&#xff1a; node.js&#xff0c;vscode&#xff0c;HBuilder X express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索电影&#xff0c;轮播图&#xff0c;电影分类&#xff0c;最近上架电影 点击电影进入电影详情&am…

MySQL(15):存储过程与函数

存储过程概述 含义&#xff1a; 存储过程的英文是 Stored Procedure 。它的思想很简单&#xff0c;就是一组经过 预先编译 的 SQL 语句的封装。 执行过程&#xff1a; 存储过程预先存储在 MySQL 服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器端发出调用…

Obsidian同步技巧

Obsidian介绍 Obsidian支持Markdown语法&#xff0c;所见即所得。 软件支持多仓库功能&#xff0c;支持笔记文件夹和分层文件夹&#xff0c;等功能。 值得一提的是&#xff0c;软件的笔记同步功能需要付费。 同步技巧 官方同步方法 若资金充足&#xff0c;则可在Obsidian官网…

Django(四、路由层)

文章目录 一、路由层1.路由匹配url方法第一个是参数 的正则表达式 二、正则无名分组与有名分组无名分组有名分组 三、反向解析1.概念无名分组动态路由解析有名分组动态路由解析 四、路由分发为什么要用路由分发&#xff1f; 1.总路由分发配置名称空间 五、伪静态的概念六、虚拟…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…

【Java】集合(二)Set

1.Set接口基本介绍 无序:存取顺序不一致不重复:可以去除重复无索引:没有带索引的方法&#xff0c;所以不能使用普通for循环遍历&#xff0c;也不能通过索引来获取元素 2.Set集合的实现类 HashSet:无序、不重复、无索引LinkedHashSet: 有序、不重复、无索引TreeSet: 可排序、不…

二维码智慧门牌管理系统升级解决方案:数据可视化助力运营精准决策

文章目录 前言一、升级版二维码智慧门牌管理系统的特点二、数据可视化助力运营精准决策 前言 随着科技的不断进步&#xff0c;传统的门牌管理系统已经无法满足现代社会的需求。为了提高管理效率&#xff0c;减少人力成本&#xff0c;我们引入了升级版的二维码智慧门牌管理系统…

同城服务如何引流和推广 同城小程序制作

客观原因线下实体店经营变得很艰难&#xff0c;而抖音推出的同城号功能&#xff0c;为许多商家带来了新的生机。抖音同城号的操作很简单&#xff0c;只需在短视频发布时打开同城号&#xff0c;短视频将被投入到同城流量池中&#xff0c;可以让位置附近的用户看到&#xff0c;线…

AttributeError: module ‘matplotlib‘ has no attribute ‘get_data_path‘

【报错】使用 AutoDL 下 Notebook 调用 matplotlib 时遇到 AttributeError: module matplotlib has no attribute get_data_path 报错&#xff1a; --------------------------------------------------------------------------- AttributeError …

C语言ZZULIOJ1148:组合三位数之一

题目描述 把1、2、3、4、5、6、7、8、9组合成3个3位数&#xff0c;要求每个数字仅使用一次&#xff0c;使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。 输入:无 输出:按从小到大的顺序输出这三个三位数&#xff0c;由空格隔开。输出占一行。 提示 若一个数能表…

No192.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

2017年计网408

第33题 假设 OSI 参考模型的应用层欲发送 400B 的数据 (无拆分), 除物理层和应用层之外, 其他各层在封装 PDU 时均引入 20 B 的额外开销, 则应用层数据传输效率约为( )A. 80%B. 83%C. 87%D. 91% 本题考察有关数据包逐层封装的相关概念。我们来一起分析一下。 这是要求大家必须…

Egg.js 中 Service 的使用

Service 服务 Service是用来编写和数据库直接交互的业务逻辑代码。Service就是在复杂业务场景下用于做业务逻辑封装的一个抽象层。 简单来说&#xff0c;就是把业务逻辑代码进一步细化和分类&#xff0c;所以和数据库交互的代码都放到Service中。这样作有三个明显的好处。 保…
最新文章