第1章 HTTP基础回顾
当你打开浏览器输入一个网址,背后发生的事情——说白了就是HTTP在工作。很多人觉得HTTP太基础了,没什么好讲的。但我在项目里见过太多次因为HTTP理解不透彻导致线上事故的例子。所以这一章我们老老实实把底子打牢。
1.1 HTTP协议是什么?
HTTP是超文本传输协议,它定义了客户端和服务器之间怎么对话。这个对话是无状态的,每次请求都是独立的。
我刚开始做Web开发时,总搞不清无状态到底意味着什么。后来踩了一个坑:一个用户登录后,下一次请求服务器又不认识他了。嗯,这就是没做会话管理。无状态是协议特性,但不是业务缺陷——我们用Cookie、Session、来补上这个缺口。
核心要点:
- HTTP工作在应用层,基于TCP/IP
- 默认端口80(HTTPS是443)
- 无状态、明文传输(这就是为什么我们要迁移到HTTPS)
1.2 请求与响应模型
HTTP的通信模式特别简单:客户端发请求,服务器回响应。你想想看,就像你去餐厅点菜——你告诉服务员要什么(请求),厨房做出来端给你(响应)。
一个HTTP请求由四部分组成:
- 请求行:方法(GET/POST等)、URL、协议版本
- 请求头:一堆键值对,告诉服务器各种信息(浏览器类型、接受的格式、Cookie等)
- 空行:分隔头部和正文
- 请求体:可选,POST请求带数据
响应也是一样的结构,只不过请求行换成了状态行。
// 一个典型的HTTP GET请求
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
// 服务器返回
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
{"users": [{"id":1,"name":"Alice"}]}
小技巧:我个人习惯在Chrome开发者工具的Network面板里直接看原始请求。很多协议细节看一遍就记住了。调试HTTPS迁移时这个功能帮了大忙。
1.3 常见状态码
状态码就是服务器给客户端的「反馈表情」。我见过不少同事把状态码背得滚瓜烂熟,但实际遇到问题还是搞不清。记住一个原则:看第一个数字就能判断大类。
| 分类 | 范围 | 含义 | 常见例子 |
|---|---|---|---|
| 1xx | 100-199 | 信息,继续处理 | 101 Switching Protocols(WebSocket升级) |
| 2xx | 200-299 | 成功 | 200 OK, 201 Created, 204 No Content |
| 3xx | 300-399 | 重定向 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 400-499 | 客户端错误 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | 500-599 | 服务器错误 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
避坑指南:我曾经在一个项目中把301和302搞混了。301是永久重定向,浏览器会缓存这个跳转;302是临时重定向,每次都会重新请求。如果我们在HTTPS迁移时要重写HTTP到HTTPS,千万别用301而自己又没做好后续维护——否则后面想改就难了。
还有个状态码我特别喜欢——304 Not Modified。它和缓存强相关,我们一会儿会展开讲。
1.4 缓存机制
HTTP缓存是性能优化的第一块金牌。说白了就是让浏览器或代理服务器把响应存起来,下次用的时候直接拿,不用再跑到服务器去要。
缓存控制靠响应头实现,最常用的是这两个:
- Expires:HTTP/1.0的产物,指定一个过期时间
- Cache-Control:HTTP/1.1的标准,更灵活。比如
max-age=3600表示3600秒内缓存有效
还有条件请求——如果缓存过期了,浏览器会用If-Modified-Since或If-None-Match问服务器:这个资源变没变?没变的话服务器只回一个304,不传正文,省带宽。
// 服务器返回带了ETag和Last-Modified
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
ETag: "abc123"
Last-Modified: Mon, 21 Mar 2025 10:00:00 GMT
// 60秒后浏览器再次请求:
GET /style.css HTTP/1.1
If-None-Match: "abc123"
If-Modified-Since: Mon, 21 Mar 2025 10:00:00 GMT
// 如果资源没变,服务器返回:
HTTP/1.1 304 Not Modified
经验之谈:我在做HTTPS迁移时遇到一个经典问题——原本HTTP环境下的强缓存资源迁移到HTTPS后,旧缓存没及时清理,导致部分用户访问旧的HTTP版本。所以我建议迁移前先把缓存过期时间设短,等全线切完再调回来。这个顺序不能错。
本章知识结构图
下面这张图把HTTP的基础骨架画清楚了——从协议本质到请求响应模型,再到状态码和缓存,都是环环相扣的。
这一章的内容就这些。记住:HTTP看似简单,但它是我们整个HTTPS迁移的基石。后面讲TLS握手、证书部署、混合内容处理时,都会反复用到这里的状态码和缓存知识。你能把这一章吃透,后面就顺了。