HTTP第16讲——HTTP的重定向和跳转

news2024/11/23 8:26:53

背景

“超文本”里含有“超链接”,可以从一个“超文本”跳跃到另一个“超文本”,对线性结构的传统文档是一个根本性的变革。
能够使用“超链接”在网络上任意地跳转也是万维网的一个关键特性。它把分散在世界各地的文档连接在一起,形成了复杂的网状结构,用户可以在查看时随意点击链接、转换页面。再加上浏览器又提供了“前进”“后退”“书签”等辅助功能,让用户在文档间跳转时更加方便,有了更多的主动性和交互性。

跳转动作是由浏览器的使用者主动发起的,可以称为“主动跳转”,但还有一类跳转是由服务器来发起的,浏览器使用者无法控制,相对地就可以称为“被动跳转”,这在 HTTP 协议里有个专门的名词,叫做“重定向”(Redirection)。

重定向的过程

用 Chrome 访问 URI “http://www.chrono.com/18-1”,它会使用 302 立即跳转到“/index.html”。
在这里插入图片描述
从这个实验可以看到,这一次“重定向”实际上发送了两次 HTTP 请求,第一个请求返回了302,然后第二个请求就被重定向到了“/index.html”。但如果不用开发者工具的话,你是完全看不到这个跳转过程的,也就是说,重定向是“用户无感知”的。
第一个请求返回的响应报文:这里出现了一个新的头字段“Location: /index.html”,它就是 301/302 重定向跳转的秘密所在。
“Location”字段属于响应字段,必须出现在响应报文里。但只有配合 301/302 状态码才有意义,它标记了服务器要求重定向的 URI,这里就是要求浏览器跳转到“index.html”。
浏览器收到 301/302 报文,会检查响应头里有没有“Location”。如果有,就从字段值里提取出 URI,发出新的 HTTP 请求,相当于自动替我们点击了这个链接。
在“Location”里的 URI 既可以使用绝对 URI,也可以使用相对 URI。所谓“绝对 URI”,就是完整形式的 URI,包括 scheme、host:port、path 等。所谓“相对 URI”,就是省略了scheme 和 host:port,只有 path 和 query 部分,是不完整的,但可以从请求上下文里计算得到。

在重定向时如果只是在站内跳转,你可以放心地使用相对 URI。但如果要跳转到站外,
就必须用绝对 URI。
如果想跳转到 Nginx 官网,就必须在“nginx.org”前把“http://”都写出来,否则浏览器会按照相对 URI 去理解,得到的就会是一个不存在的URI

重定向状态码

最常见的重定向状态码就是 301 和 302,另外还有几个不太常见的,例如 303、307、308等。它们最终的效果都差不多,让浏览器跳转到新的 URI,但语义上有一些细微的差别,使用的时候要特别注意。
301 俗称“永久重定向”(Moved Permanently),意思是原 URI 已经“永久”性地不存在
了,今后的所有请求都必须改用新的 URI。
浏览器看到 301,就知道原来的 URI“过时”了,就会做适当的优化。比如历史记录、更新书签,下次可能就会直接用新的 URI 访问,省去了再次跳转的成本。搜索引擎的爬虫看到301,也会更新索引库,不再使用老的 URI。
302 俗称“临时重定向”(“Moved Temporarily”),意思是原 URI 处于“临时维护”状
态,新的 URI 是起“顶包”作用的“临时工”。
浏览器或者爬虫看到 302,会认为原来的 URI 仍然有效,但暂时不可用,所以只会执行简单的跳转页面,不记录新的 URI,也不会有其他的多余动作,下次访问还是用原 URI。
301/302 是最常用的重定向状态码,在 3××里剩下的几个还有:
303 See Other:类似 302,但要求重定向后的请求改为 GET 方法,访问一个结果页面,避免 POST/PUT 重复操作;
307 Temporary Redirect:类似 302,但重定向后请求里的方法和实体不允许变动,含义比 302 更明确;
308 Permanent Redirect:类似 307,不允许重定向后的请求变动,但它是 301“永久重
定向”的含义。
不过这三个状态码的接受程度较低,有的浏览器和服务器可能不支持,开发时应当慎重,测试确认浏览器的实际效果后才能使用。

重定向的应用场景

先来看什么时候需要重定向。
一个最常见的原因就是“资源不可用”,需要用另一个新的 URI 来代替。
至于不可用的原因那就很多了。例如域名变更、服务器变更、网站改版、系统维护,这些都会导致原 URI 指向的资源无法访问,为了避免出现 404,就需要用重定向跳转到新的 URI,继续为网民提供服务。
另一个原因就是“避免重复”,让多个网址都跳转到一个 URI,增加访问入口的同时还不会增加额外的工作量。
例如,有的网站都会申请多个名称类似的域名,然后把它们再重定向到主站上。
决定要实行重定向后接下来要考虑的就是“永久”和“临时”的问题了,也就是选择 301 还
是 302。
301 的含义是“永久”的。
如果域名、服务器、网站架构发生了大幅度的改变,比如启用了新域名、服务器切换到了新机房、网站目录层次重构,这些都算是“永久性”的改变。原来的 URI 已经不能用了,必须用301“永久重定向”,通知浏览器和搜索引擎更新到新地址,这也是搜索引擎优化(SEO)要考虑的因素之一。
302 的含义是“临时”的。
原来的 URI 在将来的某个时间点还会恢复正常,常见的应用场景就是系统维护,把网站重定向到一个通知页面,告诉用户过一会儿再来访问。另一种用法就是“服务降级”,比如在双十一促销的时候,把订单查询、领积分等不重要的功能入口暂时关闭,保证核心服务能够正常运行。

重定向的相关问题

重定向的用途很多,掌握了重定向,就能够在架设网站时获得更多的灵活性,不过在使用时还需要注意两个问题。
第一个问题是“性能损耗”。很明显,重定向的机制决定了一个跳转会有两次请求 - 应答,比正常的访问多了一次。
虽然 301/302 报文很小,但大量的跳转对服务器的影响也是不可忽视的。站内重定向还好说,可以长连接复用,站外重定向就要开两个连接,如果网络连接质量差,那成本可就高多了,会严重影响用户的体验。
所以重定向应当适度使用,决不能滥用。
第二个问题是“循环跳转”。如果重定向的策略设置欠考虑,可能会出现“A=>B=>C=>A”的无限循环,不停地在这个链路里转圈圈,后果可想而知。
所以 HTTP 协议特别规定,浏览器必须具有检测“循环跳转”的能力,在发现这种情况时应当停止发送请求并给出错误提示。
实验环境的 URI“/18-2”就模拟了这样的一个“循环跳转”,它跳转到“/18-1”,并用参
数“dst=/18-2”再跳回自己,实现了两个 URI 的无限循环。
使用 Chrome 访问这个地址,会得到“该网页无法正常运作”的结果:
在这里插入图片描述

小结

1.重定向是服务器发起的跳转,要求客户端改用新的 URI 重新发送请求,通常会自动进行,用户是无感知的;
2.301/302 是最常用的重定向状态码,分别是“永久重定向”和“临时重定向”;
3. 响应头字段 Location 指示了要跳转的 URI,可以用绝对或相对的形式;
4. 重定向可以把一个 URI 指向另一个 URI,也可以把多个 URI 指向同一个 URI,用途很多;
5. 使用重定向时需要当心性能损耗,还要避免出现循环跳转。

PS:本文是观看极客之后的笔记。

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

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

相关文章

058:cesium设置图片纹理材质

第058个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置图片材质,相当于在球体上贴图。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共85行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设…

如何批量旋转图片方向,包教会方法分享

如何批量旋转图片方向,这个怎么搞呢?小编曾经遇到一个问题,就是我将手机上的照片上传到电脑后发现所有的图片都是倒立的,这让查看变得非常不方便。尽管小编已经尝试过打开每张图片并逐个旋转后再另存为,但这种方式十分…

qiankun + Vite + React + Vue + Angular 快速构建前端微服务

文章目录 一、主应用 vite二、微应用 react三、微应用 vue四、微应用 angular五、项目地址 一、主应用 vite npm npm create vitelatestyarn yarn create vite选择是否继续 Need to install the following packages:create-vite3.2.1 Ok to proceed? (y) y项目名称 Project…

HIVE建表详细教程

1. 注意事项如下 1.1 分区字段 可以有多个分区字段,一般以时间维度来建立分区,也可以再加其他字段。以业务场景为提前条件,来设定分区的字段。 从业务角度理解,分区字段可理解为业务数据的一部分,作为业务查询…

Bed Bath and Beyond EDI 需求分析

Bed Bath and Beyond(Bed Bath and Beyond)是一家美国的家居用品零售商,成立于1971年,总部位于新泽西州Union。该公司在美国、加拿大和墨西哥拥有超过1500家门店。其产品涵盖了床上用品、浴室用品、厨房用品、家居装饰等领域&…

Win11怎么添加用户?我们都知道系统一般默认是administraor用户

Win11怎么添加用户?我们都知道系统一般默认是administraor用户,但如果你还想添加新用户的话,那么可以参考以下操作哦,步骤简单,安全有效,我们一起来学习下吧。 具体操作如下: 1、首先&#xff0…

NXP MCUXPresso - cc1plus.exe: out of memory allocating 65536 bytes

文章目录 NXP MCUXPresso - cc1plus.exe: out of memory allocating 65536 bytes概述实验结论补充END NXP MCUXPresso - cc1plus.exe: out of memory allocating 65536 bytes 概述 在尝试迁移 openpnp - Smoothieware project 从gcc命令行 MRI调试方式 到NXP MCUXpresso工程…

iscsi删除已失效的链路

有套rac环境,主机连接存储使用的iscsi方式,使用了一段时间,客户感觉网络设计不合理,需要调整网段vlan和ip地址 首先关闭实例和集群,调整存储端和主机端的ip地址和vlan,调整后可以ping通,使用如…

隐藏自己的真实ip

本文转载于: https://blog.csdn.net/csdnmmd/article/details/126952312 1.ip查看 https://mp.weixin.qq.com/s/zs2clrxQts9f7pK6CQ2oOw 1.1 无隧道的情况 当前从138和请求ipinof.io上可以查到目前我的ip地址为真实的ip: 访问下面这个地址之后&#xff…

SVG矢量图怎么做?

SVG 矢量图是一种可缩放的图像格式,基于 XML 的标记语言。它可以用于描述二维矢量图形,并且具有数百种功能,能够帮助你创建出色的网站。SVG矢量图怎么做?在本教程中,我们将学习如何使用SVG矢量图编辑器——即时设计制作…

一种基于非均匀分簇和建立簇间路由的算法的无线传感器网络路由协议(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本文准备了一种路由方法,该方法使传感器通过有效地使用能量将数据从发送方加载到接收器,因为它在 LEAC…

安装Ubuntu18.04双系统、干净卸载,并在Ubuntu系统中安装CARLA模拟器

Ubuntu系统安装 Ubuntu系统安装参照流程 Ubuntu 双系统安装流程_ubuntu双系统_地球被支点撬走啦的博客-CSDN博客 Ubuntu系统卸载 1.将开机启动项设置默认为Windows,进入BIOS设置界面调整BootDevice中Windows和Ubuntu的顺序,将Windows调整在Ubuntu前边…

封神之作!超火Java面试突击手册一周内转发2.4W次,最终被所有大厂封杀

前言 本文是为了帮大家快速回顾了Java中知识点,这套面试手册涵盖了诸多Java技术栈的面试题和答案,相信可以帮助大家在最短的时间内用作面试复习,能达到事半功倍效果。 本来想将文件上传到github上,但由于文件太大有的都无法显示…

OpenPCDet系列 | 5.4.1 DenseHead中的AnchorGenerator锚框生成模块

文章目录 AnchorGenerator模块AnchorGenerator.generate_anchors函数 AnchorGenerator模块 首先,根据点云场景将其划分为一个个grid,这个grid size是可以通过配置文件设定的点云场景方位和voxel大小计算出来的。 POINT_CLOUD_RANGE: [0, -39.68, -3, 6…

研发工程师玩转Kubernetes——部署应用

Kubernetes是容器的管理编排工具,而容器则是程序的载体。我们先在Docker上部署应用,然后再在kubernetes上部署,并对它们进行对比学习。 Docker部署应用 查看运行中的容器 docker ps可以看到下面的表头,此时没有一个运行中的容器…

图片压缩指定大小,让您的图片高效而优美

在现代社会中,图片是我们不可或缺的一部分,在各行业中都有着非常重要的作用。但是,大尺寸的图片不仅会占用过多的存储空间,还会导致网页或应用程序的加载速度变慢。因此,将图片压缩到指定大小是一个必要的步骤。 图片…

文档管理-gitlab+markdown网页插件

特点 使用git进行版本管理,本地编辑使用Typora。使用gitlab进行权限管理可以在线阅读通过Markdown在线阅读插件实现,可显示目录显示与链接跳转,界面优于自带的wiki。 与其他方式对比 gitlab的wiki:显示界面效果不好&#xff0c…

书籍《脆弱的繁华》读后感

前几周看完了《脆弱的繁华》这本书,这本书当时是公司组织的一次活动,邀请书籍原作者,张程对书籍进行了讲解,同时这本书也是在此次活动中免费赠送的,作者对于书籍做了一些说明,并且对一些问题也进行了探讨&a…

Azkaban 集群模式部署

文章目录 Azkaban 集群模式部署一、配置Mysql Azkaban 集群模式部署 将这三个包,上传到hadoop102,第一个是azkaban需要的建表语句 这三个解压到 /opt 目录下 输入命令:tar -zxvf azkaban-db-3.84.4.tar.gz -C /opt/ 输入命令:ta…

spring注册beanDefinition

代码使用springboot测试 1.ConfigurationClassPostProcessor 构造context时会创建reader。 构造reader时会创建processor。 最关键是第一个,类型是ConfigurationClassPostProcessor。 AbstractApplicationContext类的refresh方法的invokeBeanFactoryPostProcesso…