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# 是否为内部IPif ($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.mzph.cn/news/580147.shtml

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

相关文章

Camtasia2024中文最新免授权版下载

TechSmith Camtasia2024免费版是一款非常专业且功能强大的屏幕录制工具&#xff01;使用集屏幕录像机、视频编辑器的功能于一身&#xff0c;能够轻松的录制和创建具有专业外观的视频。这套非常强大的专业录屏与视频创作大型软件套装包含捕获屏幕录制、视频剪辑和编辑、视频录音…

MySQL日期查询 今天、明天、本月、下月、星期、本周第一天、本周最后一天、本周七天日期

文章目录 今天日期明天日期本月第一天本月最后一天下个月第一天当前月已过几天当前月天数当前月所有日期获取星期本周第一天本周最后一天获取本周的七天日期 今天日期 select curdate()明天日期 select DATE_SUB(curdate(),INTERVAL -1 DAY) AS tomorrow本月第一天 select d…

嵌入式——RTC内置实时时钟

学习目标 理解原理图RTC设计部分掌握初始化RTC掌握设置时间掌握读取时间学习内容 RTC原理图 RTC结构框图 RTC时钟 开发流程 加载依赖。gd32f4xx_rtc.c,gd32f4xx_pmu.c初始化RTC。时钟配置。获取时钟。RTC初始化 // 电池管理加载 rcu_periph_clock_enable(RCU_PMU); pmu_back…

C#调用(python通过excel坐标生成的曲面地形图)案例

效果图: 文件图: 详解一:环境和python库问题 1.python 中只需要下载 matplotlib3.8.2和scipy1.11.4 2.我安装的python版本 详解二:解释器问题 python解释器这里有两种形式 第一种形式 1.调用 pycharm项目下的解释器,需要安装python必须的包(命令安装或者搜索安装)。 2.修改…

“一键批量翻译与重命名,轻松将西班牙文件名转换为中文名“

你是否遇到过需要将大量的西班牙文件名翻译成中文名&#xff0c;却无从下手的情况&#xff1f;现在&#xff0c;我们为你带来了一款强大的文件名批量翻译与重命名软件&#xff0c;让你能够轻松完成这项任务&#xff0c;提高工作效率。 首先&#xff0c;进入文件批量改名高手的主…

MEMS麦克风具备哪些优势? MP34DT05TR-A 一款MEMS音频传感器全向数字麦克风

MP34DT05TR-A是一款超紧凑、低功耗、全向数字式 MEMS 麦克风&#xff0c;内置电容式感应元件和 IC 接口。 传感元件能够检测声波&#xff0c;采用专门用来生产音频传感器的硅微加工工艺制造。IC 接口采用 CMOS 工艺制造&#xff0c;允许专用电路设计以 PDM 格式从外部提供数字…

Java自动化测试系列[v1.0.0][常见页面操作处理附源码]

[控制滚动] package util; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement;public class ScrollBarUtil {/*** 控制滚动条向下拉到底* param driver 浏览器驱动*/public static void toBottom…

Matlab之State Flow

打开方式 方式一&#xff1a;在命令窗口输入State Flow或者简写sf就能打开&#xff0c;并且会自动打开State Flow 的Library。从左到右分别是图表、真值表、状态转换表、例子、顺序查看&#xff0c;可以加入到Simulink当中。 方式二&#xff1a;从Simulink Library里面添加Sta…

SpringBoot3 应用分析

SpringBoot3-快速入门 1、简介 1. 前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA 2. 环境要求 环境&工具版本&#xff08;or later&#xff09;SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.1…

【Java】三甲公立医院综合绩效核算系统源码

医院绩效考核系统&#xff0c;建立以医院发展目标为导向&#xff0c;以医务人员劳动价值、工作量为评价基础&#xff0c;统筹效率、质量、成本的绩效管理和绩效工资分配体系。系统支持RBRVS&#xff08;以资源为基础的相对价值比率&#xff09;和DRGs&#xff08;疾病诊断相关分…

【C++高阶(九)】C++类型转换以及IO流

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C高阶 1. 前言2. C语言类型转换的方式3. C的强制…

什么是微服务架构以及落地思路

文章目录 前言一、各种架构的演进二、微服务架构落地思路 总结 前言 调用几个webapi就是微服务架构&#xff1f;或则是ngnixwebapi 集群就是微服务架构&#xff1f;这个文章带你弄懂微服务架构。 一、各种架构的演进 单体架构&#xff1a;放在一个服务器进程完成全部的后端处理…

Linux6.4、IO基础(整体深入理解文件描述符)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 本文章将从源码和内核剖析fd&#xff0c;细节和基础部分可以了解&#xff1a; 我们再来提起文件&#xff0c;文件可以分为两类&#xff1a; 磁盘文件 (未被打开)内存文件 (被进程在内存中打开) 同时我们也知道文件描…

logstash收集华为、H3C、Cisco交换机日志

网络设备配置 将 syslog-ip 替换成服务器的IP地址。 Huawei info-center loghost source interface info-center loghost syslog-ip local-time facility local6 H3C info-center loghost source interface info-center loghost syslog-ip facility local5 Aruba logging arm …

OAuth2授权码模式---详解

OAuth2简介 是一个业界标准的授权协议&#xff08;authorization protocol&#xff09;&#xff0c;这里的授权是以委派代理&#xff08;delegation&#xff09;的方式。可以这样理解&#xff0c;OAuth 2.0提供一种协议交互框架&#xff0c;让某个应用能够以安全地方式获取到用…

目标检测-Two Stage-SPP Net

文章目录 前言一、SPP Net 的网络结构和流程二、SPP的创新点总结 前言 SPP Net&#xff1a;Spatial Pyramid Pooling Net&#xff08;空间金字塔池化网络&#xff09; SPP-Net是出自何凯明教授于2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetw…

模具图纸管理系统、模具图纸管理系统有哪些?

模具图纸管理系统是一种用于管理和跟踪模具图纸的软件系统。该系统可以帮助企业有效地组织、管理和分享模具图纸&#xff0c;从而提高生产效率、降低成本和减少错误。 以下是模具图纸管理系统的一些基本功能&#xff1a; 1、文件管理&#xff1a;将模具图纸存储在一个中心化的…

工具系列:PyCaret介绍_编写和训练自定义机器学习模型

文章目录 PyCaret安装PyCaret&#x1f449; 让我们开始吧&#x1f449; 数据集&#x1f449; 数据准备PyCaret中的设置函数&#x1f449; 可用模型&#x1f449; 模型训练与选择&#x1f449; 编写和训练自定义模型&#x1f449; GPLearn模型&#x1f449; NGBoost 模型&#x…

浅谈Redis分布式锁(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 自定义Redis分布式锁的…

SpringIOC之ApplicationContextAwareProcessor

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…