zoukankan      html  css  js  c++  java
  • Web前置技能-Http协议-重定向

    状态码

    状态码是HTTP请求过程结果的描述,由三位数字组成。这三位数字描述了请求过程中所发生的情况。状态码位于响应的起始行中,如在 HTTP/1.0 200 OK 中,状态码就是 200。

    每个状态码的第一位数字都用于描述状态(“成功”、“出错”等)。

    如200 到 299 之间的状态码表示成功;

    300 到 399 之间的代码表示资源已经转移。

    400 到 499 之间的代码表示客户端的请求出错了。

    500 到 599 之间的代码表示服务器出错了。

    整体范围已定义范围分  类
    100~199 100~101 信息提示
    200~299 200~206 成功
    300~399 300~305 重定向
    400~499 400~415 客户端错误
    500~599 500~505 服务器错误
    302就属于重定向的状态码,它表示你要访问的资源在别的地方。

    301,302,303,307

    301

    是永久重定向,常用的场景是使用域名跳转。

    比如,我们访问 http://www.zhihu.com 会跳转到 https://www.zhihu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

    302

    是临时重定向,用来做临时跳转。接着上面的例子,重定向到 https://www.zhihu.com 的请求又会通过302重定向到 https://www.zhihu.com/signup?next=%2F

    301和302都是代表重定向的意思。但有啥区别?

    http 1.0规范中有2个重定向——301和302,在http 1.1规范中存在4个重定向——301、302、303和307。

    其中301在http 1.0以及http 1.1中都表示永久重定向,就不讨论了。

    那302呢?

    在http1.0中,302的规范是这样的:

    原请求是post,则不能自动进行重定向;原请求是get,可以自动重定向。

    但是浏览器和服务器的实现并没有严格遵守HTTP中302的规范,服务器不加遵守的返回302,浏览器即便原请求是post也会自动重定向,导致规范和实现出现了二义性。

    所以HTTP 1.1中将302的规范细化成了303和307

    303和307

    继承了HTTP 1.0中302的实现(即原请求是post,也允许自动进行重定向,结果是无论原请求是get还是post,都可以自动进行重定向)。

    307则继承了HTTP 1.0中302的规范(即如果原请求是post,则不允许进行自动重定向,结果是post不重定向,get可以自动重定向)。

    HTTP中的重定向和请求转发的区别

    ##转发是服务器行为,重定向是客户端行为。看两个动作的工作流程:##

    转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;

    在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

    重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。

    在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

    重定向,其实是两次request

    第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

    使用linux-curl抓去地址

    curl不会进行跳转,curl -L会跟随跳转

    curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据。

    我们直接在curl命令后加上网址,就可以看到网页源码。

    curl www.baidu.com

    curl 默认是不进行重定向的。如果要进行重定向,我们需要加上-L参数

    curl -L taobao.com

    加上 -o 参数可以保存网页源代码到本地

    curl -o taobao.txt taobao.com -L

    加上-i参数可以看到响应报文

    curl -i baidu.com
  • 相关阅读:
    hdfs搭建常见问题
    [转]opencv与Labview的结合(Dll调用)
    [转]opencv二值化的cv2.threshold函数
    忙在比赛前
    [转]使用charls抓包微信小程序的解决方案
    [转]Python调用C语言
    [转]基于Python实现matplotlib中动态更新图片(交互式绘图)
    [转]Python十六进制与字符串的转换
    STM32学习日记
    [转]Linux下的softlink和hardlink
  • 原文地址:https://www.cnblogs.com/dork/p/13795557.html
Copyright © 2011-2022 走看看