Nginx快速入门:return、rewrite重定向、重写详解(六)

0. 引言

我们在日常的生产过程中,常常有需要重定向转发的需求,比如企业更换了域名,但又要保证之前的域名能访问,这就需要做重定向的跳转。

我们在之前的章节中学习了Nginx的负载均衡、各类转发代理配置,今天继续来补充关于转发的的最后一个环节——重定向(或称跳转)

1. 重定向、重写详解

什么是重定向?

重定向是指将客户端的请求从一个URL自动重定向到另一个URL。这通常是通过服务器发送一个特定的HTTP状态码来完成的,告诉客户端(以及搜索引擎)资源已经移动到了新的位置。重定向可以是临时的(302 Found)或永久的(301 Moved Permanently)

一句话概括:重定向转发时浏览器上的地址是会变化的,客户是能感知到的

什么是重写?

重写是指在不改变URL的情况下,修改客户端请求的HTTP请求行(request line)或路径。这通常用于URL的标准化或修改,而不需要告诉客户端资源已经移动。重写通常在服务器配置文件中完成,例如在Nginx的rewrite指令中。

一句话概括:重写转发时浏览器上的地址是会不会变化的,客户是无感的

应用场景:
重定向用于告诉客户端资源已经移动到了新位置
重写用于在不改变客户端URL的情况下修改请求

1.1 return 详解

1.1.1 return 核心概念

介绍:

return指令用于立即结束当前处理块的执行,并返回一个状态码给客户端。这个状态码可以是204(No Content)、400(Bad Request)到500(Server Error)之间的任何值。
return通常用于访问控制、错误处理或配置特定的HTTP响应
该指令可以返回指定的响应码和重定向URL给客户端,也可以返回指定的响应码和文本给客户端

作用域:

server, location, if

语法:

return code [text];
return code URL;
return URL;

return的状态码为301、302、303、307、308时,则为重定向;
return的状态码为其他时,可以返回响应主体[text]。

1.1.2 return 案例

官方文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

  • 1、返回指定状态码和文本

如果要返回文本,需要指定 default_type application/json;,不配置的话,跳转会默认以下载文件形式

location ~ /user {
    default_type application/json; 
    return 200 "跳转成功";
}
  • 2、重定向到指定链接

重定向分为临时重定向和永久重定向:

永久重定向:
301,308 表示永久重定向,重定向结果会缓存,下次请求直接从缓存获取;区别在于301会进行方法转变,比如一个POST提交的请求,会转换为GET请求转发,而308则会保持原本方法进行转发

临时重定向:
300,该请求有多种可能的响应,浏览器可以选择它们其中的一个。服务器没有任何标准可以遵循去代替用户来进行选择
302,重定向请求转发时使用 GET 方法,不管原请求使用的是何种方法
303,基本跟 302 一致,所以很少用 303,都是使用 302
307,为了补充 302.重定向必须使用原请求的方法和包体访问

location /user/ {
        return 300 "http://www.baidu.com";
    }

或者

location /user/ {
        return "http://www.baidu.com";
    }

在这里插入图片描述
在这里插入图片描述
3、返回一个自定义页面,并将参数、uri打印出来

location /test {
     default_type text/html;
     set $name 跳转成功;
     return 200 <html><p>$name</p><p>request_uri:$request_uri</p><p>document_uri:$document_uri</p><p>uri:$uri</p><p>query_string:$query_string</p><p>args:$args</p></html>;
 }

注意,要让nginx支持显示中文,需要在nginx.conf中配置:

http {
     ...
    charset utf-8;
}

在这里插入图片描述

1.2 rewrite 详解

1.2.1 rewrite 核心概念

官方文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
介绍:

Nginx 的 rewrite 模块是一个功能丰富的组件,它使得用户能够通过正则表达式对请求的 URI 进行重写。rewrite 模块支持 PCRE(Perl Compatible Regular Expressions)正则表达式,这为用户提供了强大的匹配和重写能力。通过正则表达式,用户可以精确地控制哪些请求需要被重写以及重写后的 URI。同时,rewrite 模块还提供了一系列的标记(flag),如 last、break、redirect、permanent 等,以控制重写后的行为,例如是否继续执行后续的重写规则、是否返回重定向响应等。这个功能通常用于以下几种场景:

  • URL 规范化:使 URL 看起来更规范、合理,便于用户记忆和搜索引擎优化。
  • 动态 URL 地址伪装:企业常常将动态 URL 地址伪装成静态地址提供服务,以提高系统的负载能力和用户体验。
  • 域名更换:当网站更换域名时,可以通过 rewrite 指令将旧域名的访问跳转到新域名上,确保用户的访问不会受到影响。
  • 业务调整:在服务端进行某些业务调整时,可能需要通过重写 URL 来实现特定的访问控制或数据分发。

作用域:

server, location, if

语法:

rewrite regex replacement [flag];

可选的flag参数:

  • last

标记表示在执行了当前的重写规则后,继续执行后续的 rewrite 规则或 location 匹配。
它通常用在 server 块或 if 块中,以确保重写规则可以与其他规则组合使用,形成一个规则链。

  • break

标记表示在执行了当前的重写规则后,停止执行后续的所有 rewrite 规则。
它通常用在 location 块中,用于确保一旦某个重写规则匹配并执行后,不会继续执行其他可能存在的重写规则。

  • redirect:

标记表示重写规则执行后,返回一个重定向响应(HTTP 302 状态码)给客户端,而不是继续处理请求。
它用于实现临时性的重定向,比如在网站维护时将用户重定向到另一个地址。

  • permanent

标记表示重写规则执行后,返回一个永久重定向响应(HTTP 301 状态码)给客户端,并且后续的请求应该直接跳转到新的 URI,而不是再次执行重写规则。
它用于实现永久性的重定向,比如在域名更改后,将旧域名重定向到新域名。

301和302的应用场景:
302 需要经常变化跳转路径的uri则使用302
301 基本不变的调整uri(http跳转https、seo)

1.2.2 rewrite 案例

1、替换旧域名xxx.com为新域名yyy.com

server {
	listen       80;
	server_name  www.xxx.com;		#域名修改	
	charset utf-8;
	
	location / {
	#添加域名重定向
        if ($host = 'www.xxx.com'){						#$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.yyy.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串
        }
        root   html;
        index  index.html index.htm;
}        

2、旧域名访问/user/的请求跳转新域名,并且访问在路径上添加/new/


server {
	listen       80;
	server_name  www.xxx.com;		
	charset utf-8;
	
	#添加
	locatoin /user/ {
        rewirte (.+) http://www.newxxx.com/new$1 permanent;		#这里的$1为位置变量,代表/user/
    }
	
	locaiton / {
        root   html;
        index  index.html index.htm;
    }
}

3、将动态链接改为伪静态链接(看起来像是静态链接的地址)

用户访问:www.xxx.com/user/view/3/index.html
实际地址:http://www.xxx.com/user/index.jsp?post=3&action=view

location ~ /user/view {
    rewrite /user/(.*)/(.*)/(.*).html /user/$3.jsp?post=$2&action=$1 last;
}
$N 表示第几个括号中的变量

4、业务新版本上线,要求所有 IP 访问任何内容都显示一个维护页面,只有允许 IP 192.168.244.2访问后台业务

先创建维护页面

ehho "<h1>系统升级中... 持续时间 2023-12-24 23:00:00 -2023-12-24 23:50:00 </h1>" > /var/www/html/system.html

修改配置

server {
	listen       80;
	server_name  www.xxx.com;		
	charset utf-8; # 显示中文
 
	# 是否转发标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    # 是否为内部IP
	if ($remote_addr = "192.168.244.2"){		
        set $rewrite false;
    }
	# 跳转维护页面
    if ($rewrite = true){						
        rewirte (.+) /system.html;				#将域名后边的路径重写成/system.html
    }
    location = /system.html {
        root /var/www/html;						#网页返回维护页面
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}

5、项目升级,但部分jsp链接未升级,需要将所有.jsp访问转发到原项目

location ~* .*\.jsp {
        rewrite (.+) http://www.old.xxx.com$1 permanent;
}

2. 总结

本章,我们重点讲解了重定向和重写的区别,并且讲解了return,rewrite的用法,用实际的案例进行了演示,下一节我们将展示nginx如何实现企业安全防护

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

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

相关文章

【编译原理】词法分析器

【编译原理】词法分析器 实验要求&#xff1a; 设置一个名字表NameL和常数表ConstL&#xff0c;当遇到标识符时&#xff0c;将其字符串送入名字表NameL&#xff0c;并把其名字表地址作为标识符的语义Seman值。常数情形也一样&#xff0c;不要求翻译成二进制数。要求在NameL和…

java八股 集合

常见集合篇-01-集合面试题-课程介绍_哔哩哔哩_bilibili 1.时间复杂度 ------List 2.ArrayList扩容机制1.5 2.1 List和数组互转 3.LinkedList链表 3.1 LinkedList和ArrayList区别 4.HashMap 4.1红黑树 红黑树会自平衡&#xff0c;所以是二叉排序树BST的plus自平衡版。 4.2 散列…

瞬态抑制二极管(TVS)的主要参数?|深圳比创达电子

一、最大反向漏电流IR&#xff08;Reverse Leakage Current&#xff09;和额定反向关断电压VRVRWM&#xff08;Stand-off Voltage&#xff09;&#xff1a;VR是TVS的最大直流工作电压&#xff0c;当TVS两极的电压小于VR时&#xff0c;TVS处于关断状态&#xff0c;此时流过的最大…

软件系统详细设计说明书(直接套用)

1引言 1.1编写目的 1.2项目背景 1.3参考材料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统…

LeetCode刷题--- N 皇后

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归…

实现高效、透明、公正的采购寻源——鸿鹄电子招投标系统

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

24款奔驰GLS450升级香氛负离子 车载香薰功能

相信大家都知道&#xff0c;奔驰自从研发出香氛负离子系统后&#xff0c;一直都受广大奔驰车主的追捧&#xff0c;香氛负离子不仅可以散发出清香淡雅的香气外&#xff0c;还可以对车内的空气进行过滤&#xff0c;使车内的有害气味通过负离子进行过滤&#xff0c;达到车内保持清…

侦探IP“去推理化”:《名侦探柯南》剧场版走过26年

2023年贺岁档&#xff0c;柯南剧场版的第26部《黑铁的鱼影》如期上映。 这部在日本狂卷票房128亿日元的作品&#xff0c;被誉为有史以来柯南剧场版在商业成绩上最好的一部。 但该作在4月份日本还未上映前&#xff0c;就于国内陷入了巨大的争议。 试映内容里&#xff0c;灰原…

计算机视觉基础(13)——深度估计

前言 本节是计算机视觉的最后一节&#xff0c;我们将学习深度估计。从深度的概念和度量入手&#xff0c;依次学习单目深度估计和双目/多目深度估计&#xff0c;需要知道深度估计的经典方法&#xff0c;掌握深度估计的评价标准&#xff0c;注意结合对极几何进行分析和思考。 一、…

Linux账号和权限管理

目录 前言 一、管理用户账号 1、Linux系统中用户账号类型 2、用户标识UID的分类 3、用户账号文件 4、用户账号的初始配置文件 5、用户账号的管理命令 5.1 useradd 5.2 usermod 5.3 passwd 5.4 userdel 二、管理组账号 1、Linux系统中组账号类型 2、组标识号GID的…

PointNet人工智能深度学习简明图解

PointNet 是一种深度网络架构&#xff0c;它使用点云来实现从对象分类、零件分割到场景语义解析等应用。 它于 2017 年实现&#xff0c;是第一个直接将点云作为 3D 识别任务输入的架构。 本文的想法是使用 Pytorch 实现 PointNet 的分类模型&#xff0c;并可视化其转换以了解模…

工程监测中振弦采集仪与其他监测技术的比较研究

工程监测中振弦采集仪与其他监测技术的比较研究 工程监测中常用的监测技术包括振弦采集仪、激光测距仪、全站仪、GPS等。下面是振弦采集仪与其他监测技术的比较研究&#xff1a; 1. 测量精度&#xff1a;振弦采集仪可以实现毫米级别的测量精度&#xff0c;对于振动、位移等参数…

用友U8CRM系统help2 任意文件读取漏洞复现

用友U8CRM系统的help2文件中接口存在任意文件读取漏洞&#xff0c;攻击者在未登录情况下即可进行漏洞利用。 1.1 漏洞级别 高危 1.2 快速检索 fofa语法&#xff1a; title"用友U8CRM"1.3 漏洞复现 该漏洞利用非常简单&#xff0c;只需构造get请求 访问该地址即可…

跨境电商速卖通、Lazada、Shopee为什么要自己做补单测评,看完就明白了

大家好&#xff0c;今天来跟大家聊一下速卖通补单的一些事项&#xff0c;首先要知道&#xff0c;国内补单跟跨境补单&#xff0c;其实核心是差不多的&#xff0c;只不过国内的补单可能要找一些团队补单。做国内电商的的卖家很多会自己建立鱼塘来给自己补单&#xff0c;这样也比…

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

idea利用JRebel插件,无需重启,实现Spring Boot项目热重载,节省开发时间和精力!

插件介绍 官方介绍 翻译过来的意思是&#xff1a; JRebel 是一款提高开发效率的工具&#xff0c;允许开发者立即重新加载代码更改。它跳过了在Java开发中常见的重新构建、重启和重新部署循环。JRebel 能够让开发者在相同的时间内完成更多工作&#xff0c;并且在编码时能够保持…

WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印

文章目录 前言相关文章Nlog配置HandyControl配置简单使用显示效果文本内容 前言 我将简单的HandyControl的消息打印系统和Nlog搭配使用&#xff0c;简化我们的代码书写 相关文章 .NET 控制台NLog 使用 WPF-UI HandyControl 控件简单实战 C#更改控制台文字输出颜色 Nlog配置 …

2024年3月电子学会青少年编程等级考试时间安排

1考试方式 1. 在线居家考试&#xff08;全国&#xff09;&#xff1b; 2. 对于符合线下考试要求的考试服务网点&#xff0c;经地方实地调研报学会总部批准后&#xff0c;可组织线下考试。 2报名时间 报名时间&#xff1a;2023年12月21日-2024年3月12日16:00&#xff1b; 考…

2024有什么好用的电脑录屏软件?TSC2024喀秋莎Camtasia中文版本新功能介绍

Camtasia2024最新版本是一款屏幕录制和视频剪辑软件&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 多轨编辑 支持多轨道编辑&#xff0c;方便对…

背道而驰的两家企业

写在前面 先给昨天的 推文 做个更新。 昨天说到&#xff0c;抖音官方辟谣了收购饿了么的事情。 当天&#xff0c;阿里发生较大的人事变动&#xff0c;然后再次传出「盒马」和「饿了么」摆上货架的事情&#xff0c;随后又被快速否认。 当一个假消息被反复而又密集地提起&#xf…
最新文章