海滨擎蟹

面试遇到的坑(一)—— http 状态码 301 和 302 的区别

这个问题,之前也看了无数遍,301 永久重定向,302 临时重定向。使用方面,代码里的重定向大多是 302,也就是临时的。永久重定向只在域名统一访问路径的时候用过,比如说把所有的 非 https://www.baidu.com 的访问连接都重定向到这个标准地址上。

面试的时候,一位看似资深的面试官问了这个问题。我回答一个是永久,一个是临时,但他并不买账,非要我说出其他区别来。我。。感觉心里有十万匹草泥马在奔腾。真心想不出来,印象中,代码里就没有用过 301 重定向。还有什么其他区别?不清楚。结果他很不满意。感觉就是,我不懂的样子。

看到一篇文章里讲到,状态码对搜索引擎有影响。

302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。

而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。

另一篇文章这样解释:

对于用户
301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL。页面跳到了这个新的url指向的地方。
对于引擎及站长
302转向可能会有URL规范化及网址劫持的问题。可能被搜索引擎判为可疑转向,甚至认为是作弊。

这我还真不知道,大概他想问是这个吧(也许是这样,但我就是觉得他也不懂,就是想装样子)。

附: nginx 301、301 重定向设置

rewrite 后面接上 permenent 就代表 301 跳

//把来自 veryyoung.me 的请求 301 跳到 www.veryyoung.me
if ($host != 'veryyoung.me') {
    rewrite ^/(.*)$ http://www.veryyoung.me/$1 permanent;
}

接上 redirect 就代表 302 跳

//把来自 veryyoung.me 的请求 302 跳到 www.veryyoung.me
if ($host != 'veryyoung.me') {
    rewrite ^/(.*)$ http://www.veryyoung.me/$1 redirect;
}

PHP实现

301

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.google.com");

302

<?php
header("Location: http://www.google.com");

参考:状态码 301 和 302 的区别HTTP 状态码中 301 和 302 的区别

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »