Apache通过mod_negotiation实现多语种分发,需启用模块、规范命名(如index.html.en)、配置AddLanguage与LanguagePriority、设DirectoryIndex为通用名(如index)、禁用后端硬编码Content-Language,并用curl验证响应头。

Apache 的 mod_dir 和 mod_negotiation 协同工作时,能实现干净、自动、符合 HTTP 规范的多语种内容分发。但要注意:mod_dir 本身不参与协商,它只负责目录索引和默认文档处理;真正驱动语言选择的是 mod_negotiation,而 mod_dir 的行为(比如是否触发 DirectoryIndex)会影响协商能否被正确触发。关键在于配置逻辑闭环,避免默认行为覆盖协商结果。
必须启用并确认 mod_negotiation 已加载
该模块虽默认编译进 Apache 2.4+,但多数发行版(如 Ubuntu/Debian)默认未启用。仅靠 Options +MultiViews 不起作用:
- 运行
sudo a2enmod negotiation启用模块 - 检查生效:
apache2ctl -M | grep negotiation应输出negotiation_module (shared) - 重启服务:
sudo systemctl restart apache2
文件命名与目录结构要匹配协商维度
多语种分发依赖变体(variant)文件的规范命名,Apache 通过后缀识别语言维度:
- 文件需放在同一目录下,主名一致,后缀体现语言标签,例如:
index.html.en、index.html.zh-cn、index.html.fr - 后缀必须与
AddLanguage指令声明的语言标签严格对应(如.zh-cn对应zh-CN) - 不要用
_或-混淆,.zh_cn会被忽略;.zh虽可识别,但不推荐——应使用 RFC 1766 标准格式
用 AddLanguage + LanguagePriority 控制语言回退逻辑
在 块中配置,明确告诉 Apache 哪些后缀代表哪种语言,并设定优先级顺序:
<directory>
Options +MultiViews +FollowSymLinks
AddLanguage en .en
AddLanguage zh-CN .zh-cn
AddLanguage fr .fr
LanguagePriority en zh-CN fr
ForceLanguagePriority Fallback
</directory>
-
ForceLanguagePriority Fallback表示:当请求头中无匹配语言时,按LanguagePriority顺序选第一个(如en) - 若省略该指令,Apache 可能返回 406 Not Acceptable,而非降级
让 mod_dir 配合协商,而不是干扰它mod_dir 的 DirectoryIndex 指令默认值是 index.html,这会直接命中 index.html 文件,跳过协商。必须调整:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 将
DirectoryIndex设为不含具体语言后缀的通用名,例如:DirectoryIndex index - 这样访问
/时,Apache 才会尝试匹配index.*的所有变体(index.en、index.zh-cn等),触发mod_negotiation - 切勿保留
DirectoryIndex index.html,否则协商完全失效
禁用硬编码 Content-Language 响应头
PHP 或 CGI 脚本若手动输出 header('Content-Language: en'),会覆盖协商结果。确保:
- 后端脚本不设置
Content-Language或Content-Type - 让 Apache 全权控制响应头,它会根据所选变体自动添加
Content-Language: zh-CN和Vary: Accept-Language
验证协商是否生效
- 用 curl 测试不同语言头:
curl -H "Accept-Language: zh-CN,zh;q=0.9,en;q=0.5" http://localhost/→ 应返回index.html.zh-cn内容curl -H "Accept-Language: ja" http://localhost/→ 因无ja变体且启用了Fallback,应返回index.html.en - 查看响应头是否有
Vary: Accept-Language和正确的Content-Language










