知识文章 · 编写日期 2026-11-06

黄色网缓存为何要区分请求语言

因为同一网址可能按请求中的语言偏好返回不同正文。若响应使用Vary: Accept-Language,缓存复用时需要把该请求字段也纳入匹配,不能只因网址相同就拿中文副本回答英文请求。Vary说明选择条件,本身不翻译文字,也不保证任何副本一定可缓存。

沿用黄色网的中性网页识读定位,回答页面语言变化的HTTP知识,不确认任何同名平台。下文是虚构GET /help模型:服务器确实按Accept-Language选择中英文、两种响应都允许缓存且仍新鲜,其他条件固定;不涉及登录态、个性化或真实网络测试。

黄色网网页知识图解:Accept-Language不同的同URL请求通过Vary区分缓存变体
原创缓存匹配图:三个同URL请求按语言分为两个变体,C的复用仍须满足其他缓存条件。 本站原创知识示意图;例子为教学设定,不是软件或实景截图。

先把语言偏好与实际正文分开

Accept-Language是客户端表达语言偏好的请求头;服务器是否提供相应版本,取决于服务实际支持和选择逻辑。把浏览器语言换成英文,并不会让任何中文网页都自动变成英文。MDN也说明该字段通常是选择提示,不能取代用户明确选择的语言。

Vary则在响应里出现。Vary: Accept-Language告诉缓存,这次表示的选择受该请求字段影响。它不是正文语言标签,也不是要求浏览器立即重译或刷新整页的指令。

三个请求,为什么只按网址分组会出错

原创模型中A请求GET /help,带Accept-Language: zh-CN,得到中文帮助;B请求相同方法和网址,字段为en,得到英文帮助。设两份响应均有相同的Vary声明,并满足存储条件。缓存需要区分这两个变体,不能因为A先到就把中文直接复用给B。

C再带zh-CN请求同一网址,可以匹配A的中文变体。图里用“方法、网址、语言字段值”表现这项区别,不是列出所有浏览器或代理实际缓存键。模型特意固定了其他条件,也没有把中文与英文存成两个不同URL。

匹配变体,只是复用条件的一部分

匹配Vary列出的字段,不等于已经满足全部缓存条件。RFC 9111还要求考虑方法、目标地址以及新鲜度或验证等规则。即使C与A语言相同,如果旧响应已经不能直接复用,仍可能需要再向服务器确认或获取响应。

相反,没有匹配的语言变体时,缓存不能凭“内容看起来差不多”擅自选另一份。本文不展开304验证流程;那是确定了所选表示后是否能继续使用已有副本的另一问题。

遇到语言错配,不要先归因于用户身份

记录同一网址、请求中的语言字段,以及响应是否含Vary,才有条件分析这个机制。如果只有两张不同语言截图,不能断言一定是Vary、缓存错误、地区封锁或账号差异。服务器也可能使用显式语言链接、个人设置或其他选择方式。

给读者的清楚结论是“相同网址并不足以证明同一响应表示”。本页不要求访问敏感页面做实验,也不提供任何网站的缓存配置方案;开发调试可在自己的测试页面与无敏感信息的记录上理解这项规则。

动手核对

  1. 在自己的测试例中固定请求方法和网址,明确服务是否按语言选正文。
  2. 分别保留两个请求的Accept-Language和值及对应响应。
  3. 查看响应Vary声明,用其字段区分候选缓存变体。
  4. 再核其他复用条件;没有请求记录时只描述可见语言差异。

常见问题

Vary会自动把中文翻译成英文吗?

不会。正文由服务器等实际生成;Vary说明用于区分响应的请求字段。

两个请求网址相同,就一定命中同一缓存吗?

不一定。Vary列出的字段及其他缓存条件也可能参与选择。

语言字段相同就一定不联网吗?

不能这样保证。缓存是否已有、是否仍可直接复用及验证条件都要另外考虑。

看见语言不同能确认发生缓存错误吗?

不能。还可能是显式语言选择、服务逻辑等原因;需要具体请求和响应依据。

依据与延伸阅读

  • MDN:Vary response header(官方资料,核验日期 2026-11-06)

    Vary描述除方法和URL外影响响应选择的请求字段,用于缓存变体区分。

  • RFC 9111:HTTP Caching,4与4.1节(官方资料,核验日期 2026-11-06)

    重用响应须匹配Vary列出的请求字段,并遵守目标、方法及新鲜度或验证等其他条件。

  • MDN:Accept-Language(官方资料,核验日期 2026-11-06)

    Accept-Language表达客户端语言偏好,是内容协商提示,不保证服务一定具有相应语言正文。

继续阅读