Published on

http状态码

Authors
  • avatar
    Name
    hpoenixf
    Twitter

背景

HTTP状态码 是一个高频的面试问题。 一般来说,大家熟悉的状态码有:

  • 404 页面不存在
  • 500 服务器错误
  • 301 永久重定向
  • 302 临时重定向
  • 200 OK
  • 401 未授权

如果只是简单地答这些,可能只能拿到五六十分。为了让面试官对你的 HTTP 知识留下深刻印象,可以重点介绍以下三个状态码及相关知识:304 协商缓存101 协议升级307 HSTS 跳转


304 协商缓存

什么是协商缓存?

协商缓存是一个基础的知识点。 当面试官问到 "什么是协商缓存?" 时,可以从以下几点展开:

  • 浏览器缓存分类

    • 强制缓存:无需访问服务器,返回结果是 200
    • 协商缓存:需要访问服务器,若命中缓存,返回结果是 304
  • 强制缓存的两种方式

    • Expires:基于具体的过期时间(旧标准)。
    • Cache-Control:基于时间长度,优先级更高(新标准)。
  • 协商缓存的两种方式

    • Last-Modified:记录资源的上次修改时间。
    • ETag:基于资源内容计算的唯一值,用于应对频繁修改的资源,优先级更高。

通过区分这两类缓存和优先级,可以向面试官展示你对浏览器缓存的系统理解。


101 协议升级

101 协议升级的状态码主要用于 WebSocketHTTP/2 的升级。

WebSocket

  • WebSocket 的特点包括:全双工通信、实时数据更新等。

HTTP/2

  • HTTP/2 的优点
    • 支持单个连接的多次请求。
    • 使用二进制传输。
    • 压缩头部信息。
    • 支持服务器推送。

面试官可能会进一步追问 HTTPS、HTTP、HTTP/2 及其前身 SPDY 的区别和优劣势,以及它们的连接建立过程。这些需要你在面试前自行深入研究。


307 HSTS 跳转

什么是 HSTS?

HSTS 全称 HTTP Strict Transport Security(HTTP严格传输安全),其功能是:

  • 要求浏览器下次访问该站点时直接使用 HTTPS,而无需经过 HTTP 跳转 HTTPS 的过程。
  • 避免 SSL 剥离攻击,即攻击者通过劫持 HTTP 请求,伪装为用户,破坏安全性。

使用方法

  • 在服务器响应头中添加 Strict-Transport-Security,可以设置 max-age 参数。
  • 示例:Strict-Transport-Security: max-age=31536000; includeSubDomains

提到 SSL 剥离攻击时,可以补充:

  • SSL 劫持攻击:通过信任第三方的安全证书,监听 HTTPS。
  • 例如,代理软件可能会利用这一点进行劫持。

通过讲解 HSTS 跳转的应用场景和安全性,还可以展示你对安全相关知识的理解。


204 No Content 和预检请求

204 状态码的常见应用:预检请求

预检请求的触发条件:

  1. 简单请求

    • 请求方法为 GETHEADPOST
    • 请求头仅使用跨域安全头。
    • Content-Typetext/plainmultipart/form-dataapplication/x-www-form-urlencoded
    • 未使用 ReadableStream 对象。
  2. 非简单请求

    • 发起 OPTIONS 类型的预检请求。

常见的跨域响应头:

  • Access-Control-Max-Age:缓存预检请求的时间,避免重复发送两次请求。
  • Access-Control-Allow-Origin:允许跨域的域名。
  • Access-Control-Allow-Credentials:是否允许发送 cookie
  • Access-Control-Allow-Headers:允许的请求头列表。

通过详细解释 204 和预检请求,能展现你对跨域请求机制的理解。


总结

仅仅三个状态码,就可以牵涉到如此丰富的知识。 对于 HTTP 状态码,我们不能仅仅停留在背诵状态码及对应的含义,而是要深入挖掘,借助状态码建立起自己的网络体系。


课后作业

问题: 301 和 302 有什么区别?分别适用于什么场景?

提示: 不要只记 "永久重定向" 和 "临时重定向" 的字面含义,思考它们的应用场景、缓存机制和在搜索引擎中的影响。