• Nginx的location和rewrite


    Nginx的location和rewrite


    从功能看rewrite和 location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而 location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器

    1.常用的Nginx正则表达式

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

    2.location

    2.1分类

    location 大致可以分为三类:
    精准匹配:location = / { }
    一般匹配:location / { }
    正则匹配:location ~ / { }

    2.2匹配规则

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

    2.3优先级

    优先级:精确>前缀>正则>一般>通用

    优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先

    2.4示例说明

    (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
    • 26
    • 27
    • 28
    • 29
    • 30

    2.5实际场景

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

    #第一个必选规则
    直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网
    可以是一个静态首页,也可以直接转发给后端应用服务器
    location = / {
        root   html;
    	index  index.html index.htm;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    #第二个必选规则
    处理静态文件请求,这是nginx作为http服务器的强项
    有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
    location ^~ /static/ {
        root /webroot/static/;
    }
          
    location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #第三个规则
    通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
    非静态文件请求就默认是动态请求
    location / {
        proxy_pass http://tomcat_server;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.rewrite

    3.1概述

    rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。

    比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

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

    例如 http://www.lwb.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

    3.2rewrite跳转场景

    ● URL看起来更规范、合理

    ● 企业会将动态URL地址伪装成静态地址提供服务

    ● 网址换新域名后,让旧的访问跳转到新的域名上

    ● 服务端某些业务调整

    3.3rewrite跳转实现

    请添加图片描述

    3.4rewrite实际场景

    ■ Nginx跳转需求的实现方式

    ​ ● 使用rewrite进行匹配跳转

    ​ ● 使用if匹配全局变量后跳转

    ​ ● 使用location匹配再跳转

    ■ rewrite放在server{},if{},location{}段中

    ​ ● location只对域名后边的除去传递参数外的字符串起作用

    ■ 对域名或参数字符串

    ​ ● 使用if全局变量匹配

    ​ ● 使用proxy_pass反向代理

    3.5语法格式

    rewrite   [flag];
    
    regex :       表示正则匹配规则
    replacement : 表示跳转后的内容
    flag :        表示rewrite支持的flag标记
    
    flag标记说明
    last :     本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中
    break :    本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中
    redirect : 返回302临时重定向,浏览器地址会显示跳转后的URL地址    
    permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.6示例

    (1)基于域名的跳转

    现在公司旧域名www. lwb.com有业务需求变更,需要使用新域名www. benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

    #修改配置文件
    [root@liwenbin ~]# vim /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2

    请添加图片描述

    #创建日志文件
    [root@liwenbin ~]# mkdir -p /var/log/nginx
    [root@liwenbin ~]# touch /var/log/nginx/www.lwb.com-access.log
    
    #在/etc/host文件内添加映射
    [root@liwenbin ~]# echo "192.168.36.129 www.lwb.com www.benet.com" >> /etc/hosts
    
    #重启服务
    [root@liwenbin ~]# systemctl restart nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在虚拟机中打开火狐,在网页中输入 www.lwb.com

    回车之后可以看到,域名跳转到了 www.benet.com,然后F12,点击网络,F5查看结果,如图显示

    请添加图片描述

    (2)基于客户端IP访问跳转

    今天公司业务新版本上线,要求所有IP访问任何都显示一个固定维护页面,只有公司IP:192.168.36.129访问正常

    #创建维护页面的目录,并添加内容
    [root@liwenbin ~]# mkdir -p /var/www/html
    [root@liwenbin ~]# echo "正在维护,等!">/var/www/html/weihu.html
    [root@liwenbin ~]# cat /var/www/html/weihu.html
    正在维护,等!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #修改配置文件
    [root@liwenbin ~]# vim /usr/local/nginx/conf/nginc.conf
    
    • 1
    • 2

    请添加图片描述

    [root@lwb ~]# systemctl restart nginx
    
    • 1

    除了192.168.36.129主机外再开一台虚拟机,分别在网页输入192.168.36.129

    主机结果:

    请添加图片描述

    另外一台虚拟机结果:

    请添加图片描述

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

    当访问的域名为 http://bbs.lwb.com/post/1.html 时自动跳转到 http: //www.lwbtc.com/bbs/post/1.html

    #创建一个bbs目录下post的网页文件,并添加内容,添加新的映射关系
    [root@lwb ~]# mkdir -p /usr/local/nginx/html/bbs/post
    [root@lwb ~]# vim /usr/local/nginx/html/bbs/post/1.html
    

    wo shi tian cai

    [root@lwb ~]# echo "192.168.36.129 bbs.lwb.com" >> /etc/hosts
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    #修改配置文件
    [root@lwb ~]# vim /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2

    请添加图片描述

    [root@lwb ~]# systemctl restart nginx
    
    • 1

    网页输入 bbs.lwb.com/post/1.html

    可以看到域名已经跳转

    请添加图片描述

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

    访问 http://www.lwb.com/100-(100|200)-100.html 会跳转到 http://www.lwb.com的页面

    #修改配置文件
    [root@lwb ~]# vim /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2

    请添加图片描述

    [root@liwenbin ~]# systemctl restart nginx
    
    • 1

    再到网页中输入 http://www.lwb.com/100-100-100.html 和 http://www.lwb.com/100-200-100.html,发现都可以跳转到 www.lwb.com

    因为第三个数字设置了不是固定数, http://www.lwb.com/100-100-666.html ,第三个数字随意输入都可以跳转

    请添加图片描述

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

    访问 http://www.lwb.com/upload/666.php 跳转到首页(常用场景:网站新用户提示需要注册)

    #修改配置文件
    [root@lwb ~]# vim /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2

    请添加图片描述

    [root@liwenbin ~]# systemctl restart nginx
    
    • 1

    网页输入 http://www.lwb.com/upload/666.php

    请添加图片描述

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

    访问一个具体的页面,如: http://www.lwb.com/qqq/888.html,能跳转到首页

    #修改配置文件
    [root@lwb ~]# vim /usr/local/nginx/conf/nginx.conf
    
    • 1
    • 2

    请添加图片描述

    [root@liwenbin ~]# systemctl restart nginx
    
    • 1

    请添加图片描述

  • 相关阅读:
    gitlab配置hook,commit message的时候校验提交的信息
    easy-excel 解决百万数据导入导出,性能很强
    C++正则表达式
    JS之事件
    从头学前端-HTML简介
    C++内存管理
    腾讯云新用户优惠券领取方法及使用教程
    JVM进阶之卡表
    java毕业设计GuiTar网站设计Mybatis+系统+数据库+调试部署
    技术分享 | app自动化测试(Android)-- 参数化用例
  • 原文地址:https://blog.csdn.net/liwenbin19920922/article/details/125983083