18 | 四通八达:HTTP的重定向和跳转
18 | 四通八达:HTTP的重定向和跳转
讲述:Chrono
时长10:35大小12.11M
重定向的过程
重定向状态码
重定向的应用场景
重定向的相关问题
小结
课下作业
赞 25
提建议
精选留言(57)
- 钱2020-03-29之前面试官好像比较喜欢问外部重定向和内部重定向的区别? 外部重定向,服务器会把重定向的地址给浏览器,然后浏览器再次的发起请求,地址栏的地址变化了。 内部重定向,服务器会直接把重定向的资源返给浏览器,不需要再次在浏览器发起请求,地址栏的地址不变。 重定向我的经验,主要用在未登录或者权限不足的场景,跳转到对应的登录或提升页面之中。 当然,通用的SSO也是这样做的。展开
作者回复: 1.内部重定向对于用户来说成本低,因为只在网站服务器内部跳转,所谓的router。 2.对,这是最常见的应用场景之一。
共 7 条评论43 - Geek_5b0e472020-03-27笔记: 主动跳转:跳转动作是由浏览器的使用者主动发起的; 被动跳转:跳转动作是由服务器发起的,浏览器使用者无法控制。 1、重定向状态码 301:俗称“永久重定向”,原URI已经“永久”性地不存在了,今后的所有请求都必须改用新的URI. 302: 俗称“临时重定向”,原URI处于“临时维护”状态,新的URI是起“顶包”作用的临时工。 303 See Other: 类似302,但要求重定向后的请求改为GET方法,访问一个结果页面,避免POST/PUT重复操作; 307 Temporary Redirect: 类似302,但重定向后请求里的方法和实体不允许变动,含义比302更明确; 308 Permanent Redirect: 类似307,不允许重定向后的请求变动,但它是301“永久重定向”的含义 2、重定向的应用场景 一个最常见的原因就是“资源不可用”,需要用另一个新的URI来代替。 不可用的原因:如域名变更、服务器变更、网站改版、系统维护。 另一个原因就是“避免重复”,让多个网址都跳转到一个URI,增加访问入口的同时还不会增加额外的工作量。如:有的网站会申请多个名称类似的域名,然后把它们重定向到主站上。 3、重定向的相关问题 第一个问题是“性能损耗”。重定向的机制决定了一个跳转会有两次请求-应答,比正常的访问多了一次。 第二个问题是“循环跳转”。如果重定向的策略设置欠考虑,可能会出现“A=>B=>C=>A”的无限循环。展开
作者回复: great。
15 - 蚂蚁内推+v2019-08-19老师,使用301会比302有较大的性能提升么
作者回复: 对于单次请求来说是没什么差别的,但浏览器会对301做优化,后续的请求就不会再有跳转动作,所以会快一些。
12 - 夏目2019-12-031、301用于废弃原地址跳转新地址,302用于暂时无法访问原地址跳转新地址,两者都需要浏览器重新发起一次请求 2、最开始接触重定向的时候就是用于未登录跳转登录页了
作者回复: 说的很好。
9 - 一步2019-07-18老师,这个301,302, 303重定向要求前后协议一致吗?http不能调转https?
作者回复: 没有要求,当然可以跳转到https。
共 2 条评论10 - snake2020-06-22站外重定向就要开两个连接,如果网络连接质量差,那成本可就高多了,会严重影响用户的体验。 ------------》 老师这个我不理解,站外重定向,比如重定向到其他网站,那客户端的连接跟自己的服务端应该就没有什么关系了吧?为什么还有两个连接呢?不是客户端应该跟其他网站的服务器连接吗?展开
作者回复: 是这样的:首先与本站是一个连接,然后到外站,就必须再开一个连接,这样就是两个连接了,两次tcp握手,对于客户端成本就很高了,当然服务器是无所谓的。
8 - 毛毛2019-07-08重定向和转发的区别和用途,以后章节会讲吗?
作者回复: 你说的“转发”指什么?是代理吗?如果是的话很快就会讲到。
共 4 条评论6 - lll2020-09-19“另一个原因就是“避免重复”,让多个网址都跳转到一个 URI,增加访问入口的同时还不会增加额外的工作量。”这句话怎么理解呢?
作者回复: 比如说Google就注册了很多的域名,比如goo.gl、g.cn等等,但都指向的是同一个服务,这样对于用户来说就很方便,随便记一个就能访问。
共 2 条评论5 - 尿布2020-09-09重定向报文里还可以用Refresh字段,实现延时重定向,例如”Refresh: 5; url=xxx“告诉浏览器5秒钟后再跳转 与跳转有关的还有一个”Referer“和”Refereer-Policy“(注意前者是个拼写错误,但已经”将错就错“),表示浏览器跳转的来源(即引用地址),可用于统计分析和防盗链
作者回复: 把重要的信息当做笔记保存起来,这个习惯很好。
4 - Maske2020-06-141.好比去寄快递,我去到常去的寄送点,发现寄送店有一块告示栏,被告知当前地点近期处于维修状态,需要前往另一个临时寄送点办理(302状态码),临时地址即为location字段值。或者被告知当前寄送店已永久搬迁至新地址(301状态码),临时地址为location字段值。两者都表示当前访问地址已失效,区别在于一个为临时的,短期的,另一个为永久性的。 2.比如商城类的页面,需要浏览个人中心或者订单列表等页面时需要进行登录态校验,如果没有登录或者登录态失效了,需要重定向到登录页。某个页面进行了重构,且url发生了变化,由于老url遍布站点的很多页面,不好直接修改跳转url,此时将老url重定向到新url是比较合适的。 有个疑问请教一下老师: 内部重定向和外部重定向一般在使用场合上有什么区别? 查了一下 资料说内部重定向不会造成浏览器地址栏url的变化,实际对客户端是无感知的,只是代理转发到另一个url。个人感觉又不太对,因为资料上又说nginx的重定向是属于内部,但是实际客户端url确实变了,比较矛盾展开
作者回复: 说的挺好。 内部重定向是服务器内部处理流程的跳转,不会发给客户端让客户端去跳转。 Nginx同时支持外部和内部重定向,写法是不同的,区别就在于客户端是否有感知。
4 - 天方夜2021-02-21有同学提到 ajax 中的重定向,这是个有点复杂的问题。简单说,xhr 方式,存在 Location 的情况下只能看到重定向后的最终结果;fetch 方式,可以看到 Location,而且对于重定向有不同的处理模式,可以设置。
作者回复: ajax属于前端技术了,我了解的不多,欢迎同学补充交流。
3 - 天方夜2021-02-20从短域名跳长域名(z.cn - www.amazon.cn),从 http 跳 https,分别应当用哪种重定向,有没有最佳实践呢?
作者回复: 我觉得正文里的可以参考,就是看这个跳转是否是“临时”的,如果是永久条件就用301,而跟长短域名、http到https没有特别的关系。
4 - Geek_steven_wang2019-08-19Sso就会用重定向引导用户登录。 但如果location中没有地址,那浏览器也不知跳转到那,会出错。
作者回复: 是的。
共 2 条评论3 - coral2021-04-17一个问题: 打开qq.com的时候,浏览器进行了两次跳转: http://qq.com => https://qq.com =>https://www.qq.com 访问google.ca的时候也有类似的现象 http://google.ca/ => http://www.google.ca/ => https://www.google.ca/?gws_rd=ssl 为什么要设计中间的那一层呢?从第一步直接redirect到最后一个url不行吗? 作业 1. 301 和 302 非常相似,试着结合第 12 讲,用自己的理解再描述一下两者的异同点。 同:两者都会让访问者知道,当前url不可用,并且会在location字段里回复你要去的的url。 异: 301: “永久重定向”(Moved Permanently),表示原来的页面永久不可用,所有优化的程序都可以更新了,如浏览器可以更新bookmark,爬虫更新搜索库。 302: “临时重定向”(“Moved Temporarily”),要访问的页面临时不可用了,优化程序不需更新,临时跳转一下即可。 2. 你能结合自己的实际情况,再列出几个应当使用重定向的场景吗? 需要更换域名/页面url的时候,可以给旧的url设置一个重定向,导到新的url去,这样曾经bookmark旧url的用户也可以访问到新的内容而不会看到报错页面。 还有把http页面重定向到https、把不带www的页面重定向到www.开头的页面也是很常见的操作。展开
作者回复: 现在的网站都有这么一个趋势,用简短的域名,不用写出签名的“www”,但真正的域名还是有“www”的,所以就要用一个跳转。
3 - 信信2019-07-24文中提到的所有链接都返回200,和访问http://www.chrono.com/一个效果。。。。。。
作者回复: 建议打开开发者工具,看看uri是如何处理的。 比如http://www.chrono.com/18-1?dst=/15-1?name=a.json,应该是跳转到15-1。
共 2 条评论2 - 响雨2019-07-09我这边要做一个web升级,在升级过程中要展示升级进度,就打算301重定向到另一个服务来展示升级的进度
作者回复: 不错。
共 3 条评论2 - TerryGoForIt2019-07-08重定向可以应用于实现负载均衡。
作者回复: 对,但多了一次请求的成本,比较重。
2 - 饭饭2019-07-08老师您好, 重定向,我一般使用在移动PC互切的情况下会使用,因为使用到了域名会不一样。还有一种情况会在判断浏览器的时候会使用到重定向,比如IE。。。 但是有一个问题,302是临时重定向,想问一下浏览器在每次访问的时候,都会直接访问原先URI吗?还是会有什么过期时间呢?展开
作者回复: 302不改变原uri,所以每次都会找原uri,成本较高,应当尽量少用。
2 - keep it simple2020-01-21老师你好,提交几个问题: 1.在自己的测试中,保存了一个https://bing.com的书签,访问后得到301,location为cn.bing.com,但书签中的地址并没有改变,还是https://bing.com。是否意味着我使用的浏览器没有遵循301的规范? 2.关于303的使用场景是什么?如果原请求方式就是POST,用于上传一组数据,然后服务器返回303,浏览器端只能用GET,那需要上传的数据就无法被上传了吧? 3.关于307的描述,言外之意是302可以改变请求里的方法和实体,但服务端只返回location的情况下,浏览器也不会改变请求方法和实体吧?展开
作者回复: 1.这个没有错,书签是一个正确的地址,只是bing.com给了你一个301跳转,是否更新书签是浏览器的问题,这已经不是http协议的问题了,可以更新也可以不更新。 2.303可以用来防止客户端重复post,比如post一次,后续再多次post都转向一个固定的等待响应页面。 3.302、307这些都是对客户端的“指示”,表示服务器希望客户端接下来要怎么做最合适,决定权还是在客户端。
1 - 狼的诱惑2019-08-12老师好,又来请教问题了 1.状态码301,302是有些客户端遵循http规范默认支持吗?比如浏览器,是不是浏览器解析了返回状态码,解析到301或302然后解析出地响应头/15-1地址然后又发起了一次http请求?能举例那些客户端不支持重定向吗? 2.我觉得看文章的同时,我们是不是结合着老师提供的实验源码,来了解整个来龙去脉,这样会更容易理解?虽然老师用的lua,但还是可以勉强看懂的展开
作者回复: 1.浏览器为了方便用户访问网页,肯定是要自动跳转到新的uri的。如果你用Python等语言自己实现客户端,那就可以自己定义处理策略了。 2.实验环境的lua源码都很简单,只有最小的服务器逻辑,如果能参照着看是最好的。
1