Skip to content

🌍 HTTP 与 HTTPS 协议

上网的本质:浏览器发一个 HTTP 请求,服务器回一个 HTTP 响应

HTTP 是什么

HTTP = HyperText Transfer Protocol,超文本传输协议。基于 TCP,默认端口 80。

客户端(浏览器)                    服务器(nginx)
      │                                   │
      │  GET /index.html HTTP/1.1         │
      │  Host: kb.sirenzhuli.cn           │
      │──────────────────────────────────→│
      │                                   │
      │  HTTP/1.1 200 OK                  │
      │  Content-Type: text/html          │
      │                                   │
      │  <html>...页面内容...</html>       │
      │←──────────────────────────────────│

HTTP 请求方法

方法含义场景
GET获取资源打开网页、查 API
POST提交数据登录、表单提交
PUT替换资源更新整条数据
DELETE删除资源删记录
PATCH部分更新改一个字段
HEAD只要响应头检查资源是否存在
OPTIONS看支持哪些方法CORS 预检

HTTP 状态码

2xx 成功

状态码含义
200 OK请求成功
201 Created创建成功(POST 后)
204 No Content成功但无返回体

3xx 重定向

状态码含义
301 Moved Permanently永久迁移(域名换了)
302 Found临时跳转
304 Not Modified没变化,用缓存

4xx 客户端错误

状态码含义常见原因
400 Bad Request请求格式不对JSON 解析失败
401 Unauthorized没登录Token 过期
403 Forbidden没权限nginx deny
404 Not Found资源不存在URL 写错
405 Method Not Allowed方法不对GET 改 POST 没配
429 Too Many Requests请求太频繁触发了限流

5xx 服务端错误

状态码含义常见原因
500 Internal Server Error服务器内部错误代码崩了
502 Bad Gateway网关错误上游服务挂了
503 Service Unavailable服务不可用正在重启
504 Gateway Timeout网关超时上游处理太久

HTTP 请求头(常用)

http
GET /api/users HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0 (浏览器标识)
Accept: application/json
Authorization: Bearer eyJhbGci...
Content-Type: application/json
Cookie: session_id=abc123

响应头

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 256
Cache-Control: max-age=3600
Set-Cookie: session_id=xyz789; HttpOnly; Secure
Access-Control-Allow-Origin: *

HTTPS = HTTP + TLS 加密

对比HTTPHTTPS
端口80443
加密明文(谁抓包谁看光)TLS 加密
证书不需要需要 SSL 证书
SEO搜索引擎不优先优先收录
浏览器显示 ⚠️ 不安全显示 🔒

TLS 握手(简化)

客户端                        服务器
  │                              │
  │  ClientHello(支持的加密套件)│
  │─────────────────────────────→│
  │                              │
  │  ServerHello + 证书 + 公钥   │
  │←─────────────────────────────│
  │                              │
  │  验证证书 ✓                  │
  │  生成对称密钥,用公钥加密     │
  │─────────────────────────────→│
  │                              │
  │     开始加密通信              │
  │←════════════════════════════→│

用 curl 测试 HTTP

bash
# GET 请求
curl https://kb.sirenzhuli.cn

# 只看响应头
curl -I https://kb.sirenzhuli.cn

# POST JSON 数据
curl -X POST https://api.example.com/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123"}'

# 带 Authorization
curl -H "Authorization: Bearer <token>" \
  https://api.example.com/users

# 看详细过程(含 TLS 握手)
curl -v https://kb.sirenzhuli.cn

# 忽略证书验证(仅测试用!)
curl -k https://localhost:8443

HTTPS 排故

bash
# 1. 证书是否有效
openssl s_client -connect kb.sirenzhuli.cn:443 -servername kb.sirenzhuli.cn </dev/null 2>/dev/null | \
  openssl x509 -noout -dates -subject

# 2. 证书链是否完整
openssl s_client -connect kb.sirenzhuli.cn:443 -showcerts

# 3. 支持的 TLS 版本
nmap --script ssl-enum-ciphers -p 443 kb.sirenzhuli.cn

🎯 本章要点

  • HTTP 状态码:2xx 成功、3xx 跳转、4xx 你错了、5xx 我错了
  • HTTPS = HTTP + TLS,证书验证身份 + 加密数据
  • curl 是 HTTP 排故瑞士军刀:-I 看头、-v 看过程、-k 跳过证书
  • 查证书到期:openssl s_client ... | openssl x509 -dates
  • 4xx/5xx 排查顺序:nginx error log → 应用日志 → 代码
加载练习题中...

有问题或补充?欢迎留言