apache内容协商通过mod_negotiation模块实现,需启用模块、配置multiviews选项,并按规范命名文件(如index.html.en),配合addlanguage和languagepriority指令匹配accept-language头,协商失败时用errordocument 406指定默认版本。

直接用 Apache 的内容协商(Content Negotiation)机制是最贴近 HTTP 协议原意的做法,不需要重写 URL 或依赖后端逻辑。关键在于让 Apache 自动根据 Accept-Language 头匹配对应语言的静态资源,并返回最合适的版本。
启用并配置 mod_negotiation
这是实现内容协商的核心模块,必须启用:
- 运行
a2enmod negotiation(Ubuntu/Debian)或手动在httpd.conf中取消LoadModule negotiation_module的注释 - 确保目标目录启用了
MultiViews选项(不是Options All,而是显式声明) -
MultiViews允许 Apache 在找不到精确匹配文件时,自动查找带语言后缀的变体(如about.html.en、about.html.zh)
按标准命名规则组织静态文件
Apache 不识别任意后缀,必须遵循 IANA 语言标签规范和约定后缀:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 英文页面:命名为
index.html.en,法文:index.html.fr,简体中文:index.html.zh-CN - 也可用短格式(如
.zh),但需在配置中明确定义映射,避免歧义 - 所有语言版本应放在同一目录下,不拆分到
/en/、/zh/子目录——否则协商失效
设置 LanguagePriority 和 AddLanguage
告诉 Apache 如何排序和识别语言变体:
-
AddLanguage en .en—— 将.en后缀绑定为英语 -
AddLanguage zh-CN .zh-CN—— 显式支持带区域的标签(推荐用于中文) -
LanguagePriority en zh-CN fr—— 当客户端未明确偏好或多个变体权重相同时,按此顺序兜底 - 注意:
LanguagePriority必须在<ifmodule mod_negotiation.c></ifmodule>块内,且生效前提是已启用MultiViews
处理协商失败与默认回退
用户请求 /about.html,但只有 about.html.en 和 about.html.fr,而 Accept-Language 是 de,此时 Apache 默认返回 406 Not Acceptable。更实用的做法是:
- 用
ErrorDocument 406 /about.html.en指向默认语言版本(需确保该文件存在) - 或配合
FallbackResource /index.html.en(Apache 2.2.16+),对所有未匹配路径统一降级 - 避免用
ErrorDocument 404,因为协商失败是 406,不是 404;设错会导致静默返回错误文件或循环










