• Nginx之正则表达式、location匹配简介及rewrite重写



    一、常见的nginx正则表达式

    ^ :匹配输入字符串的起始位置
    $ :匹配输入字符串的结束位置
    * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
    + :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
    ? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
    . :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
    \ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
    \d :匹配纯数字
    {n} :重复 n 次
    {n,} :重复 n 次或更多次
    {n,m} :重复 n 到 m 次
    [] :定义匹配的字符范围
    [c] :匹配单个字符 c
    [a-z] :匹配 a-z 小写字母的任意一个
    [a-zA-Z0-9] :匹配所有大小写字母或数字
    () :表达式的开始和结束位置   如:( jpg | gif | swf )
    | :或运算符
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、location

    1.location大致可以分为三类

    精确匹配:location = /{}
    正则匹配:loction ~ / {}
    一般匹配:location / {}
    
    • 1
    • 2
    • 3

    2.location常用的匹配规则

    =:进行普通字符精确匹配,也就是完全匹配
    ^~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location
    ~:区分大小写的匹配
    ~*:不区分大小写的匹配
    !~:区分大小写的匹配取非
    !~:不区分大小写的匹配取非
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.location优先级

    首先精确匹配 =
    其次前缀匹配 ^~
    其次是按文件中顺序的正则匹配~和~*
    然后匹配不带任何修饰的前缀匹配
    最后交给/通用匹配
    精确>前缀>正则>一般>通用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    匹配某个具体文件location优先级是怎么排列的
    (location = 完整路径)>(location ^~完整路径)>(location ~ * 完整路径)>(location ~ 完整路径)>(location 部分起始路径)>(location /)

    匹配某个具体目录location优先级是怎么排列的
    (location = 目录) > (location ^~ 目录) > (location ~ 目录)> (location ~ * 目录) >(location 目录) > (location /)

    4.location示例说明

    1.location = / {}
    = 为精确匹配 /,主机名后面不能带任何字符串,比如访问/和/data,则/匹配,/data不匹配
    再比如location = /abc,则只匹配/abc,/abc/或/abcd不匹配。若location /abc,则既匹配/abc、/abcd/同时也匹配/abc/
    2.location / {}
    因为所有的地址都是以/开头,所以这条规则将匹配到所有请求,比如访问/和/data,则/匹配,/data也匹配,但若后面是正则表达式,会和最长字符串优先匹配(最长匹配)
    3.location /documents/ {}
    匹配所有任何以/documents开头的地址,匹配符合以后,还要继续往下搜索其他location,只有其他location后面的正则表达式没有匹配到时,才会采用这一条
    4.location /documents/abc {}
    匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
    只有其它 location后面的正则表达式没有匹配到时,才会采用这一条
    
    5.location ^~ /images/ {}
    匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
    
    6.location ~ .(gif|jpg|jpeg)$ {}*
    匹配所有以 gif、jpg或jpeg 结尾的请求.然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
    
    7.location /images/abc {}
    最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
    
    8.location ~ /images/abc {}
    匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
    
    9.location /images/abc/1.html {}
    匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    5.loation匹配顺序

    首先看优先级:精确>前缀>正则>一般>通用
    优先级相同:正则看上下顺序,上面的有限;一般匹配看长度,最长匹配的优先
    精确、前缀、正则、一般都没有匹配到,最后再看通用匹配

    6.三个匹配规则定义

    实际网站使用中,至少有三个匹配规则定义

    6.1直接匹配网站根

    1.第一个必选规则直接匹配网站根
    2.通过域名访问网站首页比较繁琐,使用这个会加速处理,比如说官网
    3.可以是一个静态首页,也可以直接转发给后端应用服务器

    location = / {
        root    html;
        index index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4

    6.2处理静态文件请求

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

    
    location ^~ /static/ {
        root /webroot/static/;
    }
    
    • 1
    • 2
    • 3
    • 4

    后缀匹配

    location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    
    • 1
    • 2
    • 3

    6.3通用规则

    第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
    非静态文件请求就默认是动态请求

    
    location / {
        proxy_pass http://tomcat_server;
    }
    
    • 1
    • 2
    • 3
    • 4

    三、rewrite

    rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向
    比如:更换域名后需要保持旧的域名能跳转到新的域名商、某网页发生改变需要跳转到新的页面、网站防盗链等等需求
    rewrite之恶能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用
    例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写

    1.语法格式

    rewrite   [flag];
    regex: 表示正则匹配规则
    replacement: 表示跳转后的内容
    flag: 表示rewrite支持的flag标记
    
    • 1
    • 2
    • 3
    • 4

    2.rewrite跳转实现

    Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else
    跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
    PCRE支持:perl兼容正则表达式的语法规则匹配
    重写模块set指定:创建新的变量并设其值

    3.rewrite执行顺序如下

    执行server块里面的rewrite指定
    执行location匹配
    执行选定的location中的rewrite

    4.flag标记说明

    last :本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中。
    break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
    redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
    permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
    
    • 1
    • 2
    • 3
    • 4

    5.rewrite和location区别

    rewrite是同一域名内更改获取资源的路径(本地不同文件的跳转)
    location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器(不同节点的跳转)


    四、rewrite案例

    1.基于域名的跳转

    现在公司旧域名www.ngs.com 有业务需求变更,需要使用新域名 www.sen.com 代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
    添加地址映射关系:www.ngs.com为旧域名,www.sen.com为新域名
    在这里插入图片描述
    编辑nginx配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述
    访问旧域名www.ngs.com会跳转至新域名www.sen.com
    在这里插入图片描述

    2.基于客户端IP访问跳转

    今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.226.131访问正常
    编辑配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述

    在/var/www/html下创建一个维护页面文件,因为我们配置文件中除本地IP访问的其他IP都指向这个路径下页面文件(也就是weihu.html)

    cd /var/www/html/
    vim weihu.html
    
    • 1
    • 2

    在这里插入图片描述
    重新加载nginx

    systemctl reload nginx    #重新加载nginx
    
    • 1

    测试
    我们使用192.168.226.131本机浏览器进行访问
    本机访问我们需要在/etc/hosts中添加映射
    在这里插入图片描述
    可以访问到
    在这里插入图片描述
    在使用其他机器浏览器进行访问显示维护页面
    在这里插入图片描述

    3.基于旧域名跳转到新域名后面加目录

    当前访问得是http://bbs.ngs.com/post/1.html会自动跳转到http://www.ngs.com/bbs/post/1.html
    创建网页文件

    mkdir -p /usr/local/nginx/html/bbs/post
    cd /usr/local/nginx/html/bbs/post
    vim 1.html
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述
    重新加载nginx服务

    systemctl reload nginx         #重新加载nginx
    
    • 1

    测试
    访问bbs.ngs.com/post/1.html会跳转到www.ngs.com/bbs/post/1.html
    在这里插入图片描述

    4.基于参数匹配(多余)的跳转

    修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述

    测试
    访问www.ngs.com/100-100-100/.html
    在这里插入图片描述

    5.基于目录下所有php结尾的文件跳转

    要求访问http://www.ngs.com/up;oad/123.php跳转到首页www.ngs.com(场景:注册、登录)
    修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述

    测试
    访问www.ngs.com/upload/123.html跳转到www.ngs.com
    在这里插入图片描述

    6.基于最普通一条url请求的跳转

    要求访问一个具体的页面,如:http://www.ngs.com/abc/123.heml,跳转到首页
    修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    
    • 1

    在这里插入图片描述
    测试
    访问www.ngs.com/abc/123.html会跳转至www.ngs.com首页
    在这里插入图片描述


  • 相关阅读:
    软考网络工程师综合题考点总结
    SAP 选择屏幕动态通过Radio Button 显示与隐藏以及控制是否必输
    照片编辑和管理软件:Lightroom Classic 2022 Mac
    uboot启动流程-uboot内存分配
    nn.functional.sigmoid
    宿舍管理系统--毕业设计
    iOS小技能:RSA签名、验签、加密、解密的原理
    理解Mysql索引原理及特性
    Java文件为什么可以跨平台执行
    Abbexa丨Abbexa动物组织 PCR 试剂盒提取说明书
  • 原文地址:https://blog.csdn.net/S314118142/article/details/126653522