ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

HTTP深水区-重定向状态码与GETPOST的传参之路

HTTP深水区-重定向状态码与GETPOST的传参之路 HTTP 深水区重定向、状态码与 GET/POST 的传参之路我的github(https://github.com/xcx55/ubuntu-linux-project)感谢各位大佬参观我的github源笔记http626-9-13、临时重定向和永久重定向26-9-14、http726-9-15、为什么写服务端要遵循返回码的准确、矛盾1、http重要内容指引报文格式认识完HTTP 才算过了笔试。真正的深水区是这些点一个按钮怎么就跳页了404 是谁画的表单数据是怎么钻进服务器的一个 URL 为什么既能是文件也能是服务这一篇把 3xx 重定向、状态码的契约、GET/POST 传参和路由全部串起来。一、先破一个题点击按钮跳转页面是怎么完成的前提认知前端代码本身是可以向对应服务器发起请求的——前端严格意义上是后端文件的映射多叉树前端代码可以直接发起请求所以点击跳转的完整链条是前端检测到点击 → 发起 HTTP 请求 → 服务端返回报文 →前端检测到报文解析依据状态码进行前端代码的再次请求——修改显示的 URL也是渲染出来的一部分。二、3xx 重定向临时与永久的分界线重定向标准自动从一个页面跳转到另一个页面就是重定向。提醒一句还有一个重定向是文件系统的——改变进程struct file*数组下标指针那是 Linux 章的老朋友同名不同物。重定向分为两种临时重定向302/307和永久重定向301。核心区别就一句话信息不同。永久重定向浏览器替你记一辈子浏览器有一个机制每一次得到永久重定向就会在本地配置文件里以 key:value 的方式写入——k: 你第一次访问的地址v: 带回来的真正地址。后面再次访问不会先走网络连接而是直接本地判断得到真正要访问的地址。一次通信终身有效。临时重定向每次都问一遍临时重定向不会写本地文件——每次都是直接去看一眼服务端发状态码回来判断去 response 里面Location 报头的地址去访问。跳一次问一次。典型场景临时重定向用得最多登录之后直接跳转到首页永久重定向我们用得比较少典型如网站换域名老地址永久搬家一个常见组合拳一般没有对应文件的给出 404要自定义 404 页面就返回 3xxLocation 指向自己的资源可以是本站路径也可以是全新主机URL。三、状态码浏览器是按状态码硬编码办事的到这里必须回答一个根本问题为什么我们写服务端要遵循返回码的准确因为浏览器的 JavaScript 逻辑是写死的3xx 开头→ 去读取 response 的 Location发起再次请求永久重定向同时写本地文件4xx 开头→ 加载本地的 404 NOT FOUND 页面200→ 读取主体body浏览器渲染。注意状态码 200 并不是直接渲染还得有 body没有 body 就不渲染。也就是说返回的状态码决定了客户端对报文怎么处理。你要是乱返回——明明 404 偏回个 200——浏览器就按 200 的逻辑走页面直接渲染不出来。浏览器客户端是好的坏的一般是服务端。那什么时候可以不遵守客户端和服务端都是自己写的时候——自己定的协议自己认就行。但只要对面是浏览器就得按浏览器的合同来。补充一个实战细节矛盾1 的化解客户端发起的请求URL 指向外站怎么办服务端直接驳回返回 404一般发现是图床的文件就发起 3xx 临时重定向让浏览器去图床那台主机拿——反正底层再建一个 TCP 连接就是了。四、一个网页有多个请求从短连接到长连接浏览器怎么显示图片前端代码可以发出多个请求先请求第一批网页HTML渲染完成后再运行到请求代码再一次发起请求加载文件图片。以前 HTTP 基于 TCP 是短连接一个网页图片少多来几次短连接还能接受但随着图片变多HTTP/1.0 就愈发不能接受了——于是推出HTTP/1.11.1 的做法请求报文里有Connection 报头服务端用 map 方式查有没有这个属性——有就保持长连接。至于默认长连接短连接的本质还得学 TCP 底层后面的笔记补上了这个坑。对应的工程细节一个网页可能有多个请求浏览器是以多线程线程池方式向服务端发起请求的。读取数据代码、视频、图片最好用vector——因为文件流读到\0会提前截断二进制方式打开 查操作系统要文件大小才不会被\0打扰。五、Content-Type服务端怎么知道自己发的是什么response 里还有一个关键报头Content-Type。服务端怎么知道自己发送的资源是什么格式的——通过资源后缀.html/.jpg/.mp4后缀从哪来客户端的 URL 会告诉服务端服务端找到文件后按后缀和 type 的转换对照表填 Content-Type 返回——客户端拿到才知道怎么渲染。六、GET/POST两条传参之路之前学的所有东西都是静态资源图片、视频、网页文件。那怎么给服务器提交数据这就是动态的参数——HTTP 常见的请求方法就是干这个的。GET参数拼在 URL 里url?键值对键值对……GET 传参是和 URL 一起传的直接可见。而且 GET 传参会进行回显——URL 回显是浏览器默认做的方便我们但也有危险密码裸奔在地址栏里。POST参数藏在正文里POST 专一化传参但通过正文提参——方法和状态码有类似的地位功能一个是报文的动作一个是报文的判决。最常见的一种方式是表单输入框就是表单渲染的结果提交表单时浏览器把namevalue按约定的编码塞进请求正文Content-Type 告诉服务端怎么解。所以说浏览器把数据给到服务器的最常见方式就是表单。七、URL 的两种视角资源路由和功能路由到这里 HTTP 最有意思的一层就出来了URL 可以是具体资源申请也可以是动态资源申请——资源路由和功能路由功能服务花样多还可以有代理服务。那服务是啥从这里切入服务就是函数参数以 k、v 传进来接入数据库服务端把函数以wwrooturl作为 map 的键值存储函数本体用function 类型擦除包装包装类里面是函数指针类型变量等等Function 作为右值塞进去每一次请求来袭服务端判断到底是要请求静态资源还是调用服务函数——是资源就返回文件是函数就把传来的数据分割、调用、返回结果所以POST 方法还是 GET 方法区别只是 URL 的判断和参数传递位置的不同注册的函数可以跨平台跨主机操作只要 TCP 连接上即可——图床就是这么玩的。总结前端本身能发请求跳转 状态码驱动的前端再次请求临时重定向每次看 Location302永久重定向浏览器记本地文件终身免问301自定义 404 3xx 自己的资源状态码是浏览器硬编码的合同3xx 读 Location、4xx 本地 404 页、200 必须有 body 才渲染——服务端返回码必须准确一个网页多个请求 → 短连接撑不住 → HTTP/1.1 的 Connection 报头支持长连接Content-Type 靠资源后缀查对照表GET 参数在 URL回显、危险POST 参数在正文表单是最常见的提交方式URL 的两种视角资源路由和功能路由——服务就是函数map 键值 function 类型擦除完成注册静态和动态在服务端一刀分开。HTTP 还剩最后两块硬骨头HTTPS 为什么安全、登录状态是怎么记住你的。下一篇收官顺带推开 MySQL 的大门。
返回列表