3xx 重定向
3xx系列是http响应包中重要的状态标准,表示重定向意义的一类状态码,这些转状态码将指导客户端执行某些行为
都是属于重定向,但不同的值,差异却不小,具体差异如下
- 301 永久重定向 Moved Permanently
- 302 临时重定向 Found
- 303 临时重定向 See Other
- 304 未修改 Not Modified
- 305 使用代理 Use Proxy
- 306 已废弃
- 307 临时重定向 Temporary Redirect
永久重定向
永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后
应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI
保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存
上面说,301是告诉客户端,资源不在我这了,你去我给你的uri那找,来,写个简单的web服务看下
var express = require('express');
var app = express();
app.get('/', function(req, res){
console.log('test')
res.send('hello 小喽喽')
// res.redirect(301,'https://www.baidu.com');
});
app.listen(3000);
首次访问是正常响应 200 ok ,然后我们改下代码
var express = require('express');
var app = express();
app.get('/', function(req, res){
console.log('test1')
res.redirect(301,'/123');
});
app.get('/123', function(req, res){
console.log('test2')
res.send('hello 小喽喽方法')
});
app.listen(3000);
再次访问,301,多刷几次,依然301,和首次访问不通的是,响应是从本地磁盘缓存中返回的,耗时也减少了,301除了告诉客户端资源转移以外,还希望客户端缓存资源,浏览器遵守http规范,所以就缓存了
临时重定向
302 ,303,307 都是临时重定向,那有啥区别呢
302意思是Found,表示临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望客户端(本次)能使用新的 URI 访问,新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。因此状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
跟路由改为post,
用postman访问看下
var express = require('express');
var app = express();
app.post('/', function(req, res){
console.log('test1')
res.redirect(302,'/123');
});
app.get('/123', function(req, res){
console.log('test2')
res.send('hello 小喽喽方法')
});
app.listen(3000);
如下图,访问成功,也没有提示,说明postman也默认不执行302的http禁止指令
改下postman配置,让它听http的话,可以看到,并没有重定向到get方法
303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源,如下图,可以正常访问到资源
307 Temporary Redirect
临时重定向。该状态码与 302 Found 有着相同的含义。尽管 302 标准禁止 POST 变换成 GET,但实际使用时大家并不遵守。307 会遵照浏览器标准,不会从 POST 变成 GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况
代码改为307重定向,看下postman,还是很听话的
304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系
我用postman访问的时候,可以看到postman对304的执行是多次重试,最后白屏
而勾选上自动重定向后,正常访问,这也再次说明,浏览器对http协议指令的执行力存在差异的情况
305 Use Proxy
被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
总结
写这篇的原因是因为做短链的时候讨论到这个问题,短链重定向,301默认缓存,302,默认不缓存,考虑到减少服务器压力,选择301重定向,顺便撸一遍3xx的码
参考文献
http状态码大全:https://www.php.cn/web/web-ht...
《图解http》
偶尔撸点文章,姑且看看,关注可送各种技术资源,不用加好友的那种送
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。