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

news2024/9/25 1:14:12

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.coloradmin.cn/o/1334855.html

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

相关文章

本地部署Jellyfin影音服务器并实现远程访问内网影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

Python基础入门第六节课笔记

while循环 for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. 当条件成立时&#xff0c;执行下方缩…

Nature | 大型语言模型(LLM)能够产生和发现新知识吗?

大型语言模型&#xff08;LLM&#xff09;是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络&#xff0c;这些神经网络由具有自注意力功能的编码器和解码器组成。编码器和解码器从一系列文本中提取含义&#xff0c;并理解其中的单词和短语之间的关系。通…

制作TikTok获客脚本必备源代码!

在这个数字时代&#xff0c;TikTok已成为全球最受欢迎的社交媒体平台之一&#xff0c;无数的品牌和企业都试图通过这个平台吸引潜在客户。 但是&#xff0c;要想在TikTok上获得更多关注和粉丝&#xff0c;除了制作有趣、有创意的内容外&#xff0c;还需要借助一些自动化工具来…

vmware虚拟机不显示网络图标没有网络解决办法

1、虚拟机终端执行命令 sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start即可出现网络图标并正常连接到网络 2、设置网络适配器为NAT 先移除网络适配器再添加网络适配器网络连接选择NAT模式

洛谷 CSP-J2020 优秀的拆分 + 直播获奖

第一道题目&#xff1a;优秀的拆分&#xff1a; 样例以及数据范围&#xff1a; 这道题目我个人一开始是并未做出来的&#xff0c;因为一开始我并没有去学习位运算&#xff0c;然后请教了一下他人&#xff0c;接下来我将对这道题的思路进行解答&#xff1a;首先我们看到n的范围是…

安捷伦Agilent 8720ES矢量网络分析仪

Agilent安捷伦8720ES S-参数矢量网络分析仪 50MHz至20GHz 100 dB 的动态范围 优异的测量精度 2个测量通道 4个显示通道 频率和功率扫描 快扫描和数据传输速度 通过/失败测试&#xff0c;强大的标记功能 电校准&#xff08;ECal&#xff09; 内部使用测试序列的自动化 可选时域…

【网络编程】基于UDP数据报实现回显服务器程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 前言 我们如果…

自媒体短视频音效、配乐素材哪里找?

找短视频音乐、音效素材就上这5个网站&#xff0c;免费下载&#xff0c;建议收藏。 1、潮点视频 https://shipin520.com/shipin-yy/?from_code2510 一个专门分享高质量视频的网站&#xff0c;站内还有非常丰富的配乐素材&#xff0c;全部都有详细的分类&#xff0c;可以选择…

【深度学习-目标检测】02 - Fast R-CNN 论文学习与总结

论文地址&#xff1a;Fast R-CNN 论文学习 1. 摘要&#xff08;Abstract&#xff09; Fast R-CNN方法的提出&#xff1a; 论文提出了一种快速区域卷积网络的办法&#xff0c;基于之前的R-CNN网络进行改进。 效率和准确性的提升&#xff1a; Fast R-CNN 在之前的工作基础上&a…

CentOS环境下Nacos2.3集成PostgreSQL

title: CentOS环境下Nacos2.3集成PostgreSQL date: 2023-12-21 19:15:00 categories: Nacos description: CentOS环境下Nacos2.3集成PostgreSQL 1. 目录 1. 目录2. 简介3. 安装部署 3.1. 部署模式3.2. 环境准备3.3. 下载安装文件3.4. PostgreSQL插件 3.4.1. 下载地址3.4.2. 结…

南邮算法期末复习

算法复习 知识点 多项式时间复杂度是指在多项式阶内&#xff08;例如&#xff0c;O(n^2), O(n^3)&#xff09;增长的算法。AOE网中的关键路径 &#xff0c;就是完成整个网络所需的最短时间&#xff0c;亦最长路径 &#xff0c;AOE网中&#xff0c;往往有若干项活动可以平行的…

ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集

文章目录 ThunderSearch简介1 项目地址2 使用方式2.1 配置文件config.json说明2.2 构建和运行 3 使用式例 ThunderSearch简介 ThunderSearch&#xff08;闪电搜索器&#xff09;是一款使用多个(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake网络空间搜索引擎】网络空间搜索引…

如何实现https密钥对登录方式

先安装docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo systemctl start docker.service systemctl enable docker.service yum install -y docker…

为何教育行业需要搭建自己的知识付费平台,而非入驻其他公域流量平台

在当今的知识经济时代&#xff0c;教育行业正面临着前所未有的机遇和挑战。随着知识付费市场的蓬勃发展&#xff0c;越来越多的教育机构和个人教师选择进入这一领域&#xff0c;以扩大影响力并实现知识变现。然而&#xff0c;在选择进入知识付费市场的路径时&#xff0c;教育行…

2023年12月【考试战报】|ORACLE OCP 19C考试通过

2023年10月【考试战报】|ORACLE OCP 19C考试通过-CSDN博客文章浏览阅读122次。自OCP认证进入中国以来&#xff0c;越来越被大多数DBA所认可&#xff0c;也越来越被企业所重视&#xff0c;90%以上DBA深造&#xff0c;都会选择OCP认证。随着OCP认证在全国范围内的普及&#xff0c…

【hacker送书第11期】Python数据分析从入门到精通

探索数据世界&#xff0c;揭示未来趋势 《Python数据分析从入门到精通》是你掌握Python数据分析的理想选择。本书深入讲解核心工具如pandas、matplotlib和numpy&#xff0c;助您轻松处理和理解复杂数据。 通过matplotlib、seaborn和创新的pyecharts&#xff0c;本书呈现生动直…

poi-tl之图表操作(基于模板)

poi-tl&#xff08;poi template language&#xff09;是Word模板引擎&#xff0c;使用Word模板和数据创建很棒的Word文档。 核心思想是在模板中放一个占位符&#xff0c;在代码中替换该占位符即可。 poi官网地址 点这里 基础工作 maven配置 <dependency><groupId&g…

猫头虎分享2023年12月17日博客之星候选--城市赛道博主文章数据

猫头虎分享2023年12月17日博客之星候选–城市赛道博主文章数据 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开…

云渲染UE4像素流送搭建(winows、ubuntu)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…