【HTTP】http重定向301/302/303/307

2023-11-04

一、概述

        重定向常常和请求转发放在一起讨论(前者是两次不相关的请求,后者是一次请求服务器端转发),然而本文并不讨论两者的区别,而是HTTP 1.0规范和HTTP 1.1规范中关于重定向的区别,以及实际使用中的情况。

        重定向实际使用是一个响应码(301或302或303或307)和一个响应头location,当浏览器收到响应的时候check响应码是3xx,则会取出响应头中location对应的url(重定向中url的编码问题,请参看点击打开链接),然后将该url替换浏览器地址栏并发起另一次HTTP事务。

        关于301、302、303、307的区别,找不到好的文章,因此打算直撸HTTP 1.0规范和HTTP 1.1规范,结合一些实际的案例和tomcat实现,来说清楚这几个状态码的差异。

1. 百度https重定向

        如下图所示,原请求访问的是http://www.baidu.com,然后返回302和location=https://www.baidu.com,从http转到https。不过关于响应行中302状态码的描述存在争议,在下文中会详细讨论。

2. tomcat重定向源码

二、详细

        http 1.0规范中有2个重定向——301和302,在http 1.1规范中存在4个重定向——301、302、303和307,其中302是值得讨论讨论的。

1. http 1.0

301

        301状态码在HTTP 1.0和HTTP 1.1规范中均代表永久重定向,对于资源请求,原来的url和响应头中location的url而言,资源应该对应location中的url。对于post请求的重定向,还是需要用户确认之后才能重定向,并且应该以post方法发出重定向请求。

        关于post请求重定向用户确认的问题,实际上浏览器都没有实现;而且post请求的重定向应该发起post请求,这里浏览器也并不一定遵守,所以说HTTP规范的实现并未严格按照HTTP规范的语义。

        在301中资源对应的路径修改为location的url,在SEO中并未出现问题,但是在302中就出现了302劫持问题,请往下看。

302

        在http 1.0规范中,302表示临时重定向,location中的地址不应该被认为是资源路径,在后续的请求中应该继续使用原地址。

        规范:原请求是post,则不能自动进行重定向,需要用户确认才能重定向;原请求是get,可以自动重定向;

        实现:浏览器和服务器的实现并没有严格遵守HTTP中302的规范,服务器不加遵守的返回302,浏览器即便原请求是post也会自动重定向,导致规范和实现出现了二义性,由此衍生了一些问题,譬如302劫持,因此在HTTP 1.1中将302的规范细化成了303和307,希望以此来消除二义性。

        补充:302劫持——A站通过重定向到B站的资源xxoo,A站实际上什么都没做但是有一个比较友好的域名,web资源xxoo存在B站并由B站提供,但是B站的域名不那么友好,因此对搜索引擎而言,可能会保存A站的地址对应xxoo资源而不是B站,这就意味着B站出了资源版权、带宽、服务器的钱,但是用户通过搜索引擎搜索xxoo资源的时候出来的是A站,A站什么都没做却被索搜引擎广而告之用户,B站做了一切却不被用户知道,价值被A站窃取了。

If the 302 status code is received in response to a request using the POST method, the user agent must not automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

Note: When automatically redirecting a POST request after receiving a 302 status code, some existing user agents will erroneously change it into a GET request.

2. http 1.1

301

        和http 1.0规范中保持一致,注意资源对应的路径应该是location中返回的url,而不再是原请求地址。

302

        在HTTP 1.1中,实际上302是不再推荐使用的,只是为了兼容而作保留。规范中再次重申只有当原请求是GET or HEAD方式的时候才能自动的重定向,为了消除HTTP 1.0中302的二义性,在HTTP 1.1中引入了303和307来细化HTTP 1.0中302的语义。

If the 302 status code is received in response to a request other than GET or HEAD , the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user , since this might change the conditions under which the request was issued.

Note : RFC1945 and RFC2068 specify that the client is not allowed to change the method on the redirected request. However, most existing user agent implementations treat 302 as if it were a 303 response, performing a GET on the Location field-value regardless of the original request method . The status codes 303 and 307 hava been added for servers that wish to make unambiguously clear which kind of reaction is expected of the client.

303

        在HTTP 1.0的时候,302的规范是原请求是post不可以自动重定向,但是服务器和浏览器的实现是运行重定向。

        把HTTP 1.0规范中302的规范和实现拆分开,分别赋予HTTP 1.1中303和307,因此在HTTP 1.1中,303继承了HTTP 1.0中302的实现(即原请求是post,也允许自动进行重定向,结果是无论原请求是get还是post,都可以自动进行重定向),而307则继承了HTTP 1.0中302的规范(即如果原请求是post,则不允许进行自动重定向,结果是post不重定向,get可以自动重定向)。

The response to the request can be found under a different URL and SHOULD be retrieved using a GET method on that resource. This method exists primarily to allow the output of a Post-activated script to redirect he user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second ( redirected ) request might be cacheable.

The different URI SHOULD be given by the Location field in the response . Unless the request method was HEAD , the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI ( S ) .

Note: Many pre-HTTP/1.1 user agents do not understand the 303 status. When interoperability with such client is a concern, the 302 status code may be used instead, since most user agents react to a 302 response as described here for 303.

307

        在http 1.1规范中,307为临时重定向,注意划红线的部分,如果重定向307的原请求不是get或者head方法,那么浏览器一定不能自动的进行重定向,即便location有url,也应该忽略。

        也就是307继承了302在HTTP 1.0中的规范(303继承了302在HTTP 1.0中的实现)。

If the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT atomatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

3. 小结

        在HTTP 1.0规范中,302的规范并没有被服务器和浏览器遵守,即规范和实现出现了二义性,因此在HTTP 1.1中,将302的规范和实现拆分成了303和307。

三、结论

        虽然在不同版本的http规范中对重定向赋予了不同的语义,但是因为使用历史和服务器实现等原因,在实际中并不一定安全按照http规范实现,因此我个人感觉上述讨论只是一个了解,在实际写代码中302还是继续用吧···

参考:

1. 《http 1.0规范》
2. 《http 1.1规范》

3. 博客:点击打开链接

附注:

        本文如有错漏,烦请不吝指正,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【HTTP】http重定向301/302/303/307 的相关文章

随机推荐

  • 华为OD机试真题-施肥问题【2023Q1】

    题目内容 解题思路 首先需要计算每个果园的施肥时间 即果园面积除以施肥机能效 然后找到最小的施肥机能效 保证施肥任务能在规定时间内完成 如果施肥天数小于果园数量 则无法完成施肥任务 返回 1 如果施肥天数等于果园数量 则直接返回最大果园面积
  • 无法用opencv 设置usb camera的解决办法

    apt get install v4l utils v4l2 ctl set fmt video width 1920 height 1080 pixelformat YUYV 转载于 https www cnblogs com gabri
  • 二叉树面试题以及线索化二叉树

    二叉树面试题 完整代码 include
  • echarts之formatter两种使用形式及蝴蝶图的绘制

    1 formatter两种使用形式 可以通过函数和字符串模板来自定义formatter 通过函数动态创建节点 通过循环param的长度 不写死节点 这样有一个好处就是当点击了某一个legend取消了数据的展示的时候 tooltip提示框不至
  • Java8-17 --- idea2022

    目录 一 idea官网 二 使用idea编写hello world 三 查看工程中的JDK配置信息 四 详细设置 4 1 显示工具栏 4 2 默认启动项目配置 4 3 取消自动更新 4 4 选择整体主体与背景图 4 5 设置编辑器主题样式
  • React 使用技巧:useReducer、immer库和 Formik工具库

    1 使用 useReducer hook useReducer 是 useState 的替代品 它可以更好的管理组件的状态 useReudcer 的格式 import useReducer from react let state disp
  • 纯CSS绘制形状(三角形、菱形、球体,长方体等等

    在前段时间看到有的面试题说让说一下梯形 当时自己懵了 所以把各种各样的常见的形状的CSS实现总结一下 基本形状实现之后就可以利用这些基本形状进行组合 就可以实现复杂的形状 1 三角形 triangle width 0 height 0 bo
  • Windows 10创建文件夹目录链接

    问题引出 我们安装软件的时候会发现有些软件虽然设置了安装在非系统盘 但是有些插件文加夹会默认放在系统盘 当我们想把这些文件夹移到别的盘 怎么办呢 毕竟要想开机快 电脑运行更顺畅 还是把系统盘空间留大一点比较好 解决措施 将原来位置下的文件夹
  • 蓝桥杯.Java.进制转换

    在本节内容 我们主要解释三道题 十六进制转八进制 十六进制转十进制和十进制转十六进制 1 十六进制转八进制 问题描述 给定n个十六进制正整数 输出它们对应的八进制数 输入格式 输入的第一行为一个正整数n 1 lt n lt 10 接下来n行
  • pyquery用法详解

    PyQuery库也是一个非常强大又灵活的网页解析库 如果你有前端开发经验的 都应该接触过jQuery 那么PyQuery就是你非常绝佳的选择 PyQuery 是 Python 仿照 jQuery 的严格实现 语法与 jQuery 几乎完全相
  • 华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路

    目录 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 先将 0 0 位置的值变为1 第一次同化 第二次同化 大家好 我是哪吒 一 题目描述 存在一个m n的二维数组
  • react-11(样式组件-组件)

    import React Component from react import ReactDOM from react dom client import styled from styled components const root
  • HBase(分布式、面向列、非结构化数据存储,基础框架,设计和操作)总结

    sqoop 总结 1 HBase 介绍 2 面向列数据库 2 1 HBase 与 传统关系数据库的区别 2 2 Hive 和 Hbase区别 2 3 Hbase 和 传统关系型数据库区别 3 Hbase 数据模型 4 HBase 基础架构
  • LeetCode-1324. Print Words Vertically

    Given a string s Return all the words vertically in the same order in which they appear in s Words are returned as a lis
  • 实时数仓建设

    数据智性就显得尤为重要 快速的获取数据反馈能够帮助公司更快的做出决策 更好的进行产品迭代 实时数仓在这一过程中起到了不可替代的作用 一 实时数仓建设的背景 传统意义上的数据仓库主要处理T 1数据 即 今天产生的数据分析结果明天才能看到 随着
  • AD Release 10 PCB 中的常见问题及解决办法

    作为一名新手小白 刚开始进行PCB设计的时候会遇到各种问题 以下是我遇到过的问题及解决办法 希望对大家有用 不正确的地方也请大家多多指正 谢谢 1 silkscreen over component pads 这个报错是说丝印层的文字和焊盘
  • android 移动网络开关打开_手把手教你>> 打开5G开关,畅享极速好网!

    5G小贴士 现在买5G手机的人越来越多 但是你知道吗 5G手机要使用5G网络 必须要打开这个开关 不然就会导致买了5G手机 却用不上5G网络今天小编教你让你的5G手机发挥真正实力 Follow me 各位小伙伴们注意了 想要使用5G网络 必
  • 用 pytorch 进行分类(二分类,多分类)

    import numpy as np import sklearn import torch import torch nn as nn from torch autograd import Variable import torch nn
  • 【Unity】记录一个Findobjectoftype有关的bug

    场景 在写一个多人联机的FPS游戏时 本地启动时 主角是有后坐力的 但是客户端射击没有后坐力 感觉很奇怪 不能房主不开挂其余人全是挂吧 于是打算找一下问题所在 这里计算后坐力的思路是这样的 在鼠标控制的脚本中进行计算后坐力 触发的方法Fir
  • 【HTTP】http重定向301/302/303/307

    一 概述 重定向常常和请求转发放在一起讨论 前者是两次不相关的请求 后者是一次请求服务器端转发 然而本文并不讨论两者的区别 而是HTTP 1 0规范和HTTP 1 1规范中关于重定向的区别 以及实际使用中的情况 重定向实际使用是一个响应码