Nginx rewrite 详解

news2025/1/6 18:41:38

Nginx rewrite 详解

本篇主要介绍 nginx 的 rewrite 重定向这个功能进行 详解介绍, 以及介绍它的使用场景

image-20221202113505079

1. rewrite 基本介绍

rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。

基本语法:

rewrite     <regex>     <replacement>     [flag];
关键字         正则                 替代内容             flag标记
  • regex: 正则表达式语句进行规则匹配
  • replacement: 将正则匹配的内容替换成replacement
  • flag: last | break | redirect | permanent
    • last : 本条规则匹配完成后,继续向下匹配新的location URI规则
    • break: 本条规则匹配完成即终止,不再匹配后面的任何规则
    • redirect : 回302临时重定向,浏览器地址会显示跳转后的URL地址 (防爬虫)
    • permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

rewrite 使用位置

  • server : 在server中针对所有的请求
  • location : 在 location 中则针对 单个匹配路径的
  • If

2. server 中使用 rewrite

直接在server中使用 rewrite , 它会被先执行 优先于 location 中的

2.1 rewrite 外部站点

rewrite 到外部站点 是指 replacement 部分 是一个完整的 带 http/https 的 外部路径 ,它的特点是 浏览器会再次请求这个新的站点 所以浏览器上的地址一定会发生变化 不受 flag 参数影响

全部拦截 ^/(.*)$

下面的配置是 所有的请求都转发了 https://www.askajohnny.com

...
server {
        listen       80;
        server_name  www.testfront.com;
        #由于是外部站点带http/s 的 所以不受flag 影响  break last .. 都会进行跳转并且变更浏览器url
        rewrite ^/(.*)$ https://www.askajohnny.com break;

        location / {
            root html;
            index index.html;
        }
}
...

部分匹配

server {
        listen       80;
        server_name  www.testfront.com;
        #只有当后缀是 数字.html 的时候才会转发到  https://www.askajohnny.com
        rewrite ^/([0-9]+).html$ https://www.askajohnny.com break;
        #其他的请求会走到这个location中
        location / {
            root html;
            index index.html;
        }
}

经过测试可以发现 直接跳转过去 并且 浏览器中的地址也直接变成了 https://www.askajohnny.com , 待会我们再详细讨论 什么时候会变化这个地址

比如在我的 博客网站中 我把http 的请求全部rewrite 转发到 https 上了, 因为我的QQ登录当时填写的回调是 http,又因为QQ互联的审核太麻烦 太慢 所以干脆就这样配置

image-20221202110932520

2.2 rewrite 到内部站

rewrite 到内部站点是指 replacement 不带http/https 而是内部的另外一个路径 , 相当于访问隐藏起来的这个 内部路径, 只有这种内部站点跳转的时候 浏览器才有可能不变地址 要看 rewite flag 参数了 last 和 break 都不会变的, 只有 redirect 和 permanent

server {
        listen       80;
        server_name  www.testfront.com;
        #只有当后缀是 数字.html 的时候才会转发到  https://www.askajohnny.com
        rewrite ^/([0-9]+).html$ /my.gif break;
        #其他的请求会走到这个location中
        location / {
            root html;
            index index.html;
        }
        # 上面的rewrite 会被路由到这里 并且浏览器是不会感知到的 
        location /my.gif {
            root /www/static/;
        }
}

经过测试 当访问 www.testfront.com/222.html 的时候

  • flag = last 浏览器不会变化 隐藏了 后端 /my.gif 地址
  • flag = break 浏览器不会变化 隐藏了 后端 /my.gif 地址
  • flag = redirect 和 permanent 浏览器变化了URL 变更状态码 302和 301

3. location 中使用rewrite

location 中也可以使用 rewrite 意思是只有匹配到 这个location 后才经过 rewrite 的正则通过后 再跳转

和上面一样 也分为 rewirte 的 replacement 是否包含http和https 外部站点

希望是如果 访问的后缀 是 数字.html 则 返回 my.gif 图 ,其他的都代理到 http://www.testbackend.com

server {
        listen       80;
        server_name  www.testfront.com;

        #rewrite ^/([0-9]+).html$ /my.gif last;

        location /my.gif {
                   root /www/static/;
                }

        location / {
            rewrite ^/([0-9]+).html$ /my.gif break;
            proxy_pass http://www.testbackend.com;
        }
 }

经过测试 只有访问www.testfront.com/数字.html 的时候 才能获取到 my.gif 文件

4. 使用场景模拟

4.1 基于域名跳转

比如现在你所在的公司 网站域名是 www.testfront.com 现在需要使用新的域名 www.newtestfront.com 替代, 但是旧的域名不能作废, 需要让旧的域名跳转到新的域名上 , 并且保持后面参数不变

模拟原本配置

server {
        listen       80;
        server_name  www.testfront.com;

        location / { 
            proxy_pass http://www.testbackend.com;
        }
 }

新配置,使用rewrite 操作 当访问老的域名 www.testfront.com 跳转到 新的 www.newtestfront.com

   server {
        listen       80;
        server_name  www.testfront.com ...;

        location / {
            # $host 是可以拿到访问的主机名
            if ( $host = 'www.testfront.com' ) {

                rewrite ^/(.*)$ http://www.newtestfront.com/$1 permanent;
            }

            proxy_pass http://www.testbackend.com;
        }

       location ^~ /static/ {
                root  /www/static;
             }
    }

    server {
        listen       80;
        server_name  www.newtestfront.com;

        location / {
           # 这里可以改成 新域名的 新后端代理的服务, 依据实际情况
           proxy_pass http://www.testbackend.com;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
   }

4.2 基于客户端 IP 访问跳转

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

   server {
        listen       80;
        server_name  www.testfront.com ...;

        # 先设置 rewrite变量为true
        set $rewrite true;

        # 当客户端ip 是172.16.225.1 的时候 才不 rewrite
        if ( $remote_addr = "172.16.225.1" ) {
           set $rewrite = false;
        }

        if ( $rewirte = true) {
           # 将rewrite到 维护界面 weihu.html
           rewrite (.+) /weihu.html; 
        }

        location /weihu.html {
           # 如果要使用 echo 则需要加载 echo-nginx-module 才行
             echo "remote_addr: $remote_addr";
           root /www/weihu/;
        }

        location / {
                 # 如果要使用 echo 则需要加载 echo-nginx-module 才行
                echo "remote_addr: $remote_addr";
            # 如果是 remote_addr 是特定的ip 则直接正常访问后台
            proxy_pass http://www.testbackend.com;
        }
    }

此时如果是 172.16.225.1 访问就可以到 后端, 如果是其他的客户端ip 访问就只能到 weihu.html 页面

image-20221202083339741

image-20221202083423353

注意 下面是 echo-nginx-module 模块需要单独下载加载 如果你需要调试的话

git clone https://gitee.com/yaowenqiang/echo-nginx-module.git

总结

本篇主要介绍了 nginx 中 rewrite 的基本概念 以及基本的使用方式 ,rewrite 可以出现在 server , location , if 中

并且介绍了 什么时候才会变化浏览器URL , 以及介绍了2个模拟场景

  • rewirte 内部站点

    当rewrite 到内部站点的时候 会根据 flag 参数 last break不变 redirect permanent 变化

  • rewrite 外部站点 带http/https 等

    当rewrite 外部站点 不管flag 参数 浏览器URL都会进行变化 相当于浏览器进行了 二次请求了

欢迎大家访问 个人博客 Johnny小屋
欢迎关注个人公众号

欢迎关注个人公众号

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA SCRIPT设计模式--结构型--设计模式之Decorator装饰模式(9)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

JSP ssh房地产项目管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh房地产项目管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7…

吉林省教育学院学报杂志社吉林省教育学院学报编辑部2022年第11期目录

特稿 高职院校思政课“一体两翼四融合”教学模式的构建探索——以吉林工业职业技术学院为例 杨宝忠;解静; 1-5 高校业财融合体系研究 朱延辉; 6-9 教育理论与管理《吉林教育学院学报》投稿&#xff1a;cn7kantougao163.com 新教育评价改革背景下幼儿园教师评价能力…

pikachu-xss部分速通

pikachu-xss部分速通 &#x1f349; &#x1f349;目录pikachu-xss部分速通反射型xss(get)反射性xss(post)存储型xssDOM型xss、DOM型xss-xxss盲打xss之过滤xss之htmlspecialcharsxss之href输出xss之js输出反射型xss(get) payload: </p><script>alert(1)</scr…

AI绘画绘图流量主小程序开发

AI绘画绘图流量主小程序开发 响应式设计——响应式布局&#xff0c;手机、平板、PC自适应匹配。 自定义模型——自定义内容模型、自定义字段、自定义表单。 付费阅读——支持企业支付宝、企业微信支付、余额支付无缝整合。 微信小程序端——微信小程序CMS客户端和服务端全部源…

【Linux】Docker 搭建 Jenkins

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 目录一、Jenkins到底是什么&#xff1f;二、持…

微服务框架 SpringCloud微服务架构 26 数据聚合 26.3 DSL 实现Metrics 聚合

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构26 数据聚合26.3 DSL 实现Metrics 聚合26.3.1 DSL 实现Metrics 聚合26 数据…

ADI DSP的JTAG设计规范(提供JTAG标准设计原理图)

早就想写点这方面内容了&#xff0c;14PIN的JTAG设计&#xff0c;是ADI从2000年至今一直延续下来的一个JTAG标准设计&#xff0c;很多兄弟在做硬件设计的时候&#xff0c;最常问的一个问题就是&#xff1a;JTAG接口定义是什么&#xff1f;更多的只知道抄原厂评估板的参考设计&a…

Nginx 反向代理与负载均衡

什么是Nginx Nginx 是一款高性能的 http 服务器和反向代理服务器&#xff0c;官方测试 nginx 能够支支撑 5 万并发链接&#xff0c;并且 cpu、内存等资源消耗却非常低&#xff0c;运行非常稳定。 Nginx 应用场景 http 服务器&#xff1a;Nginx 是一个 http 服务可以独立提供…

web前端期末大作业:HTML+CSS+JavaScript绿色的盆栽花店网站响应式模板 大学生鲜花网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

嵌入式面试问题汇总

文章目录c/c1、malloc与new的区别2、C语言内存分配的方式3、struct 与 class的区别4、const常量和#define的区别5、vector与list6、各个stl的底层实现7、动态绑定与静态绑定8、多态实现的三个条件、实现的原理9、析构函数一般写成虚函数的原因10、构造函数不能是虚函数的原因11…

把握数字化时代发展机遇,供应链协同系统驱动生物医药企业提速数字化转型升级

生物医药行业是指将基因工程、细胞工程、酶工程等现代生物技术与各种形式的新药研发、生产相结合&#xff0c;制造市场可流通药品并规模化生产的经济实体的总和。近年来&#xff0c;随着国内生物医药行业的不断扩张及竞争日益激烈&#xff0c;如何借助数字化打造生物医药企业核…

(15)点云数据处理学习——单目深度估计获得RGBD图再重建点云

1、主要参考 &#xff08;1&#xff09;大佬视频 Create Your Own Point Clouds from Depth Maps - Point Cloud Processing in Open3D_哔哩哔哩_bilibili &#xff08;2&#xff09;重要&#xff01;&#xff01;&#xff01;我前面的教程 &#xff08;7&#xff09;点云数…

配置gradle :将properties文件转换为扩展属性

配置gradle 为了便于管理项目配置信息&#xff0c;和自动复制应用图标到资源文件夹&#xff0c;为后面的一键生成app做准备。我写了一个gradle文件。 作用 项目启动的时候自动执行以下操作 在setting.gradle中引入一次后&#xff0c;全局可用。根目录的build.gradle和各个mo…

如何理解Spring?

Spring 是包含了众多⼯具⽅法的 IoC 容器。 那何为容器呢&#xff1f;容器是用来容纳某种东西的装置。比如&#xff1a;List/Map 是数据存储容器&#xff0c;Tomcat 是Web 容器等等。Spring 也是⼀个容器&#xff0c;是⼀个 IoC 容器。 那何为IoC 呢&#xff1f;IoC Inversi…

Buildroot系列开发(四)Linux工具链剖析

内容参考&#xff1a;百问网 文章目录1.什么是工具链2.什么是交叉编译工具链3.ABI4. Multilib工具链5.工具链与SDK的区别6.获得适合的交叉编译工具链7.sysroot8.Toolchain内部剖析9.根文件系统与sysroot10. 工具链组成11.整体构建过程12.自定义工具链1.什么是工具链 2.什么是交…

毕业设计-基于大数据动画电影推荐系统-python

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

面试题:三个线程按顺序打印 ABCABC

小伙伴们好呀&#xff0c;最近在重新复习&#xff0c;整理自己的知识库&#xff0c;偶然看到这道面试题&#xff1a;三个线程按顺序打印 ABCABC&#xff0c;尝试着做一下&#xff0c;才发现自己对线程还有好多地方不懂&#xff0c;蓝瘦…… &#x1f437; 思路 很明显&#xf…

Docker可视化工具Portainer安装

一、官网介绍 官方地址&#xff1a;https://www.portainer.io/ 致力于为开发者做最强大的docker管理平台二、在 Linux 上使用 Docker 安装 Portainer 官方文档地址&#xff1a;https://docs.portainer.io/start/install/server/docker/linux 1、部署前需知 &#xff08;1&a…

SautinSoft JBIG2 .Net提供了解读jb2文档的API

SautinSoft JBIG2 .Net提供了解读jb2文档的API SautinSoft的JBIG2.Net是一个独立且简单的SDK&#xff0c;为您提供了解读jb2文档的API。该部分将使您的软件能够使用3-4个C#行将JBIG2文件的任何网页转换为照片格式&#xff1a;png、Tiff、jpeg。 JBIG2.Net能给我什么 节省项目开…