第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基础回顾知识体系 HTTP协议 请求响应模型 常见状态码 缓存机制 请求行 请求头 状态行 响应头 2xx 成功 3xx 重定向 4xx/5xx 错误 Cache-Control ETag / 304 迁移前必须搞懂的基础 状态码、缓存、重定向是HTTPS迁移的核心操作点 不理解它们,后面配置HTTPS会踩很多坑

这一章的内容就这些。记住:HTTP看似简单,但它是我们整个HTTPS迁移的基石。后面讲TLS握手、证书部署、混合内容处理时,都会反复用到这里的状态码和缓存知识。你能把这一章吃透,后面就顺了。