301 永久重定向和 302 临时重定向的区别

最近 Ricky 在 Nginx 和 HAProxy 上配置重定向时发现 301 永久重定向和 302 临时重定向还是有很大区别的,尤其是在用户浏览器(以 Google Chrome 浏览器为例)这端。

301 永久重定向:

以 Nginx 为例,假设我们在 Nginx 里配置了如下 301 永久重定向:

rewrite "^/m/$" /m/home permanent;

当用户在 Chrome 里访问 https://www.test.com/m/ ,自然会跳转到 https://www.test.com/m/home ,这没有问题。但是如果我们此时对 Nginx 的重定向做了如下修改:

rewrite "^/m/$" /m/second permanent;

此时用户在 Chrome 里访问 https://www.test.com/m/ 跳转到的还是 https://www.test.com/m/home ,为什么呢?因为:

  1. 在用户第一次访问 https://www.test.com/m/ 后,这条 301 永久重定向的记录会被 Chrome 存储到 disk cache(磁盘缓存);
  2. 当用户第二次去访问 https://www.test.com/m/ 时 Chrome 不会再去服务器上请求,而是直接命中 disk cache 里的这条 301 永久重定向的记录。

如果此时要想用户能够被重定向到正确的链接,有如下三种方法:

  1. 清空浏览器缓存;
  2. 在开发者模式中,勾选 Disable cache(如下图所示),禁用磁盘缓存,然后再访问相关链接;
  3. 使用 Chrome 的无痕模式来访问相关链接。
在开发者模式中,勾选 Disable cache ,禁用磁盘缓存
在开发者模式中,勾选 Disable cache ,禁用磁盘缓存

302 临时重定向:

为了避免上述不必要的麻烦,推荐使用 302 临时重定向:

rewrite "^/m/$" /m/home redirect;

就算修改成:

rewrite "^/m/$" /m/second redirect;

用户访问 https://www.test.com/m/ 还是能跳转到正确的地址:https://www.test.com/m/second ,因为 302 临时重定向的记录是不会存储到 disk cache 的,每次访问 https://www.test.com/m/ 都会到服务器上请求。

结论:

  1. 如果你确定链接 A 从今往后都会永久重定向到链接 B ,那么请使用 301 永久重定向,这样可以减轻服务器的压力(因为有 disk cache ,所以不会每次都来服务器询问一遍);
  2. 如果重定向的配置是会发生修改的(链接 A 现在指向链接 B ,过一段时间链接 A 又会指向链接 C ),那么请使用 302 临时重定向,这样就不会命中 disk cache ,每次访问都会来服务器询问一遍。

这篇文章对你有帮助吗?

相关文章

2条评论

发表评论?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据