HTTP 重定向

225 阅读1分钟

浏览器是如何重定向的。

服务器通过返回301或者302的状态码。也同时必须返回Location的头部字段。

重定向状态码

  1. 301 Moved Permanently 永久重定向。 浏览器会去做一些优化操作。比如更新书签的地址,更新历史记录,下次访问就直接访问新的地址了。爬虫也会去更新自己的数据库。
  2. 302 Moved Temporarily 临时重定向。
  3. 303 See Other 要求重定向后改为get请求。访问一个结果页面。避免put/post的重复请求。
  4. 307 Temporary Redirect:类似 302,但重定向后请求里的方法和实体不允许变动,含义比 302 更明确;
  5. 308 Permanent Redirect:类似 307,不允许重定向后的请求变动,但它是 301“永久重定向”的含义。 不过这三个状态码的接受程度较低,有的浏览器和服务器可能不支持,开发时应当慎重,测试确认浏览器的实际效果后才能使用。

重定向存在的问题

  1. 性能的损耗。有重定向那么必然会多一次的http请求。如果是站内的话还行,可以tcp的复用。keep-alive字段。如果是跳转到站外的话就会重新建立一个tcp的链接。
  2. 避免循环跳转。可能会出现“A=>B=>C=>A”的无限循环,不停地在这个链路里转圈圈,后果可想而知。http规定浏览器必须具有检测是否循环跳转的能力,出现这种情况,浏览器会终止跳转,并给出一个错误页面。