今天下班的时候看到了一些重定向的基础知识,也算开了眼界。以前也经常使用301和302,但从来没有使用过和了解过其他的3XX的状态码,发现原来里面涉及的知识和解决的问题的还不少。

重定向的流程

浏览器首先访问服务器A的URL,服务器A返回带着location为B的URL的 header 和3XX的状态码,浏览器读取响应的3XX状态码,获取到头部的 location,然后跳转到服务器B的URL。

需要知道的,跳转是浏览器发起的。如果服务器给一个非浏览器的终端返回了3XX的状态码,那有可能是无法完成重定向的。

某年,有个应该用已经运行很很长时间了,PHP写的API接口。一直使用的是HTTP,经常被劫持,然后领导想替换成加密的HTTPS,但是客户端不能发版。后来服务器端就考虑把全站的接口从HTTP 302到HTTPS,讨论这个方案的可行性。如果知道上面的流程和知识这个方案立马就PASS了。

永久重定向

表示资源永久性的跳转到新的URL。

一个比较常见的案例就是老站迁移到新站,老站直接关闭后,老站的页面已经被搜索引擎收录了,这个时候使用永久重定向方案。

永久重定向两个状态码

301,重定向请求通常会使用GET方法,不管原请求使用的是何种方法。

308,为了补充301.重定向必须使用原请求的方法和包体访问。

临时重定向

表示资源只是临时跳转到新的URL

临时重定向一共有五个状态码,常用也就相对应的两个302和307.

302,重定向请求通常会使用GET方法,不管原请求使用的是何种方法。

303,并不表示资源变更,只是表示用新的URL的响应代替原请求。不管原请求使用的是何种方法。基本跟302一致,所以市面很少用303,都是使用302.

307,为了补充302.重定向必须使用原请求的方法和包体访问。

百度就是使用的307跳转,浏览器输入http://www.baidu.com 会307 到https://www.baidu.com

300,该请求有多种可能的响应,浏览器可以选择它们其中的一个。服务器没有任何标准可以遵循去代替用户来进行选择。

304,告诉浏览器,所请求的内容距离上次访问并没有变化。 可以直接从浏览器缓存里获取该资源。

后面两种不常用。

使用比较多就是301 302 307 308

循环重定向的问题

ERR_TOO_MANY_REDIRECTS

这个报错挺常见的。如果访问A页面然后重定向访问B,然后B又让重定向访问A,这样就是循环重定向了。多次重定向也会报这个错。

生产环境遇到过一次,有一次日志上发现有ERR_TOO_MANY_REDIRECTS的报错,但是在Nginx的配置上没有找到 3XX的跳转代码啊,那怎么循环跳转的。后来看到了这段配置

    location / {
try_files $uri $uri/ /index.html$is_args$args;
}

后来发现根目录下没有index.html,uri不存在,然后uri/目录也不存在,最后发起一个内部子请求到index.html.index.html不存在,又到location,反复重定向。最后报错 ERR_TOO_MANY_REDIRECTS。

重定向Redirect 的知识的更多相关文章

  1. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)

    URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上. 实现所有这些神奇 ...

  2. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)

    目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...

  3. 重定向redirect与跳转forward区别

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoResponse.a ...

  4. thinkphp 重定向redirect

    /** * URL重定向 * @param string $url 重定向的URL地址 * @param integer $time 重定向的等待时间(秒) * @param string $msg ...

  5. thinkphp51 重定向 redirect()

    thinkphp51 重定向 跨域 redirect() 可以重新定义新的路由,是fetch() 无法做到的.

  6. Laravel5:重定向 redirect 函数的详细使用

    Laravel5 中新增了一个函数 redirect() 来代替 Laravel4 中 Redirect::to() 来进行重定向操作.函数 redirect() 可以将用户重定向到不同的页面或动作, ...

  7. 请求转发(forward)和请求重定向(redirect)的区别(转)

    作者:@haimishasha本文为作者原创,转载请注明出处:https://www.cnblogs.com/haimishasha/p/5952129.html 用户向服务器发送了一次HTTP请求, ...

  8. 转发(Forward)和重定向(Redirect)的区别

    转发是服务器行为,重定向是客户端行为. 转发(Forword) :通过RequestDispatcher对象的forward(HttpServletRequest request,HttpServle ...

  9. nodejs 重定向 (redirect + writeHead(Location))

    参考: Node.js实现301.302重定向服务 Express URL跳转(重定向)的实现:res.location()与res.redirect() 一 方式1 index.js var htt ...

随机推荐

  1. Swift 分类 结构体

    感谢原作者:http://www.cocoachina.com/newbie/basic/2014/0612/8780.html 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体 ...

  2. Android显示gif格式图片

    大家知道,在Android中使用ImageView来显示gif格式的图片,我们无法得到gif格式图片该有的效果,它只会停在第一帧上,而不会继续.这时只能看到一张静态的图片,这里我们可以使用个简单的方法 ...

  3. 各种图示的介绍及绘制(boxplot、stem)

    1. 箱线图(boxplot) 也叫作箱形图: 一种用作显示一组数据分散情况资料的统计图.因形状如箱子而得名.在各种领域也经常被使用,常见于品质管理. 主要包含六个数据节点,将一组数据从大到小排列,分 ...

  4. 【转】NIO与传统IO的区别

    转自:http://blog.csdn.net/zhouhl_cn/article/details/6568119 传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时, ...

  5. 不能进入String.class调试

    Window --> Preferences --> Java --> Compiler --> Classfile Generation: "add line nu ...

  6. Mac版Visual Studio预览版

    来了,Mac版Visual Studio预览版开放下载 投递人 itwriter 发布于 2016-11-17 12:11 评论(7) 有1317人阅读 原文链接 [收藏] « » 微软前俩天宣布,推 ...

  7. WPF 3D模型的一个扩展方法

    原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...

  8. 使用devcpp在windowXP上qt4.4.3安装与使用入门

    1.安装前先安装devcpp,我下载的是devcpp-4.9.9.2_setup.exe2.安装qt4.4.3,下载的是qt-win-opensource-4.4.3-mingw.rar,解压后运行后 ...

  9. Android 5.0(L) ToolBar(替代ActionBar) 现实(四)

    经过三天休息,我回来了,我们继续讨论Toolbar. 在此之前假设您正在步步紧跟下来的序列,然后,你应该注意到MainActivity据说他已被警告.因为他们,我们声明toolbar对象.但一直没有用 ...

  10. 基于Spring开发

    1. XML Schema 1.1 最简单的标签 一个最简单的标签,形式如: <bf:head-routing key="1" value="1" to= ...