首页 > 系统相关 >Nginx系列--rewrite的使用

Nginx系列--rewrite的使用

时间:2024-02-15 20:33:05浏览次数:29  
标签:rewrite -- break Nginx html location test com

原文网址:​​Nginx系列--rewrite的使用_IT利刃出鞘的博客-CSDN博客​

简介

本文介绍Nginx中rewrite的使用。

分享Java技术星球(自学精灵):​​learn.skyofit.com​

语法

rewrite regex URL [flag];

flag标志位

  • last:停止处理rewrite,并对配更改后的 URI 重新进行搜索(再从 server 走一遍匹配流程)。此时对于当前 server 或 location 上下文,不再处理 rewrite 指令。
  • break:停止处理rewrite
  • last 和 break 的区别:last 重写 url 后,会再从 server 走一遍匹配流程,而 break 终止重写后的匹配
  • last 和 break 的相同点:都能停止处理,后面的 rewrite 指令不会再执行。
  • redirect:返回包含 302 代码的临时重定向,在替换字符串不以"http://","https://“或”$scheme"开头时使用.
  • permanent:返回包含 301 代码的永久重定向。
  • permanent 是永久重定向,浏览器会记住它,会一直重定向你设置的地址。可以通过清除浏览器缓存解决。

rewrite 指令只能返回代码 301 或 302。要返回其他代码,需要在 rewrite 指令后面包含 return 指令。

查看rewrite日志

打开日志开关:rewrite_log on; 可以配置到http,server,location和if上下文中。

示例

配置:nginx.conf

location /first {
    rewrite_log on;
    rewrite /first(.*) /second$1 last;
}

访问

curl test1.com:8080/first/2.txt

日志结果 

示例:break和last

break

配置

server {
        listen 9000;
        server_name localhost;
 
        location /info {
                rewrite ^/.* https://www.baidu.com permanent;
        }
 
        location /break {
                rewrite /.* /info break;
                proxy_pass http://127.0.0.1:9000;
 
                # 该 return 不执行
                return 200 "ok";
        }
}

访问

http://localhost:9000

结果

重定向到了baidu.com

分析

首先,匹配到 /break 的 location 块,执行了 rewrite 和 proxy_pass,跳过 return(因为有 break),重定向到 http://127.0.0.1:9000/info;然后,再次进行 server 块,匹配到 /info 的 location 块,最后重定向到了baidu。

last

配置

server {
        listen 9000;
        server_name localhost;
 
        location /info {
                rewrite ^/.* https://www.baidu.com permanent;
        }
 
        location /break {
                rewrite /.* /info last;
 
                # 该 proxy_pass 不执行
                proxy_pass http://127.0.0.1:9000;
 
                # 该 return 不执行
                return 200 "ok";
        }
}

访问

http://localhost:9000

结果

重定向到了baidu.com

分析

首先,匹配到 /break 的 location 块,执行了 rewrite,跳过 return 和 proxy_pass(因为有 last,proxy_pass 需要和 break 一起用);然后继续匹配,匹配到 /info 的 location 块,最后重定向到了baidu。

示例:在location的内部和外部

break和last在location外部

基础示例

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html;
    rewrite /2.html /3.html;
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/3.html

分析:请求1.html文件时,会被重定向到2.html,然后被重定向到3.html,最后返回的文件为3.html

例1:rewrite后添加break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。

例2:break后还有location

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
 
    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
    location /2.html {
        return 403;
    }
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。

break和last在location内部

基础示例

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html;
        rewrite /2.html /3.html;
    }
    location /2.html {
        rewrite /2.html /a.html;
    }
    location /3.html {
        rewrite /3.html /b.html;
    }
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/b.html

分析:请求1.html,会经过两次重定向到3.html,3.html又刚好匹配location /3.html{},所以返回b.html。

访问:test.com/2.html

结果:浏览器最终重定向到test.com/a.html

分析:请求2.html,会经过两次重定向到2.html,2.html又刚好匹配location /2.html{},所以返回a.html。

例1:rewrite后添加break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html break;
        rewrite /2.html /3.html;
    }
    location /2.html {
        rewrite /2.html /a.html;
    }
    location /3.html {
        rewrite /3.html /b.html;
    }
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,当前location{} 以及后面的location{} 的指令都不再执行。

例2:break后还有location

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html;
    }
    location /2.html {
        rewrite /2.html /a.html;
    }
    location /3.html {
        rewrite /3.html /b.html;
    }
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/a.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。2.html会再去匹配一次location,匹配到了location /2.html,于是返回了test.com/a.html。

 

标签:rewrite,--,break,Nginx,html,location,test,com
From: https://www.cnblogs.com/knifeblade/p/18016564

相关文章

  • Django使用聚合查询(价格乘以总数得到总价,并以总价排名)
    自定义库存表(Stock)classStock(models.Model):amount=amount=models.IntegerField(verbose_name='数量')price=models.DecimalField(max_digits=10,decimal_places=2,verbose_name='单价')使用模板语法完成自定义查询:Stock.objects.annotate(profit=F(......
  • 递归查询
    @OverridepublicList<CategoryEntity>listWithTree(){//1、查询出所有分类List<CategoryEntity>entities=super.baseMapper.selectList(null);//2、组装成父子的树形结构//2.1)、找到所有一级分类List<CategoryEntity>levelMenus=entities.stream(......
  • 归并排序模板
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn,s[N],res[N];voidmerge_sort(ints[],intl,intr){intmid=(l+r)>>1;if(l>=r)return;merge_sort(s,l,mid);merge_sort(s,mid+1,r);inti=l,k=0,j......
  • leetcode--11. 盛最多水的容器(双指针)
    记录19:462024-2-15https://leetcode.cn/problems/container-with-most-water/利用双指针来解,一个在头,一个在尾,每次最小的那个进行移动,然后计算出容积。ps:刚开始想到了用单调栈来解决,但这道题和单调栈那个例题还不一样。然后暴力解当然超时了,然后学习到了双指针(..双指针应......
  • vue 组合api 中父传子 provide和inject
    父组件import{provide,ref}from'vue'provide('data-key','thisisroomdata')子组件import{inject}from"vue";constroomData=inject('data-key')......
  • 【博客】后缀自动机
    后缀自动机在阅读了众多大佬的博客之后终于对后缀自动机有了初步理解简单整理一下学习成果大佬文献如下史上最通俗的后缀自动机详解(写的真的好)后缀自动机(SAM)-OIWiki(OI-wikiyyds)后缀自动机后缀自动机SAM-CSDN博客引入我们可以建立一个字典树将原串的所有子串......
  • P8725 [蓝桥杯 2020 省 AB3] 画中漂流
    原题链接题解1.总共有t秒,每一秒不是上升就是下降2.要在救援队赶来之前把体力全部花光code#include<bits/stdc++.h>usingnamespacestd;intdp[3005][1505]={0};//代表第i秒使用j点体力的方案数intmain(){intd,t,m;cin>>d>>t>>m;dp[0][0]=1;for(i......
  • 2024.2.15 模拟赛
    省流:rk41/58,被吊打了。别问我为什么题面没LaTeX,问就是懒。T1你现在有nn个数{ai}{ai​},现在他会对这些数做一些神秘的操作,规则如下:首先他会随便取出两个数aiai​和ajaj​(i≠j)(i=j).如果aiai​和ajaj​奇偶性相同,可以将aiai​和ajaj​合并成ai−ajai​......
  • 【博客】网络流&&费用流
    网络流前言当听到网络流量之后感觉是在充话费网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关。它模拟了水流从起点经过复杂的网络流向终点的过程就像自来水厂的水经过无数根水管子流到了家里而最大流就是最多有多少水流到了家里算法流程EK......
  • Go 100 mistakes - #26: Slices and memory leaks
        Asaruleofthumb,rememberthatslicingalargesliceorarraycanleadtopotential highmemoryconsumption.Theremainingspacewon’tbereclaimedbytheGC,and wecankeepalargebackingarraydespiteusingonlyafewelements.Using......