Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
需启用 mod_negotiation 模块并配置 MultiViews,配合标准语言后缀文件(如 about.html.zh-CN)、AddLanguage 映射及 LanguagePriority 回退顺序,禁用后端硬编码 Content-Language,确保 Apache 自动协商并返回正确语言版本及 Vary 响应头。

要通过 Apache 实现基于 `Accept-Language` 的内容协商与版本控制,核心是启用并正确配置 `mod_negotiation` 模块,配合 `MultiViews` 选项和语言变体文件命名规范。这不是简单的“加个头就能切语言”,而是需要模块、配置、文件结构、响应头管理四者协同。
必须启用 mod_negotiation 并开启 MultiViews
Apache 默认不加载 `mod_negotiation`,仅靠 `Options +MultiViews` 不会生效。
需先启用模块:
sudo a2enmod negotiation
然后在站点或目录配置中明确允许协商:
Options +MultiViews
AllowOverride All
若使用 `.htaccess`,确保 `AllowOverride All` 已设;否则直接在主配置中写。
按语言变体命名文件,严格遵循协商规则
Apache 不解析内容,只按后缀匹配 MIME 类型和语言标签。同一资源需提供多个带语言后缀的文件,例如:
about.html
about.html.en
about.html.zh
about.html.zh-CN
about.html.fr
访问 `/about.html` 时,Apache 根据请求头 `Accept-Language: zh-CN,zh;q=0.9,en;q=0.8` 自动选择最匹配的文件(如 `about.html.zh-CN`)。
注意:
• 后缀中的语言码必须是 IETF 标准格式(如 `zh-CN`,不是 `zh_CN` 或 `zhcn`)
• 文件名主体必须完全一致,仅后缀区分语言
• 若无精确匹配,会按质量因子(q 值)降序尝试,最后回退到无语言后缀的默认文件
确保语言映射被 Apache 正确认知
Apache 依赖 `LanguagePriority` 和 `AddLanguage` 指令来理解后缀含义。需在配置中显式声明:
AddLanguage en .en
AddLanguage zh-CN .zh-CN
AddLanguage zh .zh
AddLanguage fr .fr
LanguagePriority en zh-CN zh fr
`LanguagePriority` 定义无明确匹配时的 fallback 顺序。
这些指令通常放在 `
避免硬编码 Content-Language 或覆盖协商结果
如果后端脚本(如 PHP)主动设置了响应头:
header('Content-Language: en');
这会覆盖 Apache 协商出的语言头,导致浏览器无法正确识别实际返回的语言版本。
应移除这类硬编码,让 Apache 全权控制 `Content-Language` 和 `Vary: Accept-Language` 响应头。
验证方式:用 curl 查看响应头:
curl -I -H "Accept-Language: zh-CN" https://yoursite.com/about.html
确认返回中含 `Content-Language: zh-CN` 和 `Vary: Accept-Language`。
不复杂但容易忽略










