Apache通过启用mod_negotiation的MultiViews功能并规范命名(如index.en.html)实现语言自动分流,DirectoryIndex仅提供候选集,协商由Accept-Language头触发。

Apache 本身不“自动分流”语言,而是通过 DirectoryIndex 列出多个语言变体文件,并配合 mod_negotiation 的 MultiViews 机制,让浏览器根据 Accept-Language 请求头选中最匹配的首页文件。关键不是靠 DirectoryIndex 自己判断语言,而是让它把所有候选文件都摆出来,再由协商模块决定返回哪一个。
必须启用 MultiViews 并规范命名
DirectoryIndex 单独列一堆文件(如 index.html index.en.html index.zh.html)并不会触发语言选择——它只是按顺序找第一个存在的文件返回。真正实现“按语言选首页”,得靠 mod_negotiation 模块的 MultiViews 功能:
- 确认已启用模块:
sudo a2enmod negotiation(Debian/Ubuntu),然后重启 Apache - 在站点配置中开启协商:
Options +MultiViews - 文件名必须严格遵循
basename.lang.ext格式,例如:index.html(默认兜底)index.en.htmlindex.zh-cn.htmlindex.ja.html
注意:不能用下划线(index_zh.html)、中横线(index-zh.html)或大小写混用(INDEX.ZH.HTML)
DirectoryIndex 要列出所有语言变体,且顺序无关紧要
一旦启用了 MultiViews,DirectoryIndex 的作用就从“顺序查找”变成“提供协商候选集”。只要所有语言文件都在列表里,Apache 就会把它们纳入匹配范围:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 推荐写法:
DirectoryIndex index.html index.en.html index.zh-cn.html index.ja.html - 这个顺序不再决定优先级,只影响协商失败时的 fallback(即当 Accept-Language 无法匹配任何变体时,返回最左边那个存在且可读的文件)
- 确保这些文件真实存在于网站根目录下,且 Apache 进程有读取权限(
chmod 644)
避免 DirectoryIndex 和 MultiViews 冲突
常见错误是保留 index.html 同时又期望它被协商替换——但若 index.html 存在,mod_dir 可能直接返回它,跳过协商流程。解决方法有两个:
-
方案一(推荐):删掉纯
index.html,只保留带语言后缀的版本,再把DirectoryIndex设为通用名,例如:DirectoryIndex index
并提供index.en.html、index.zh-cn.html等——这样请求/时,Apache 找不到index(无后缀),就会触发MultiViews匹配所有index.*变体 -
方案二:保留
index.html作为兜底,但确保它不干扰协商——这要求MultiViews在同一作用域启用,且所有语言文件命名合规;实际中更易出错,不建议新手用
验证是否生效
别只靠浏览器访问看效果,要用命令行模拟不同语言请求:
- 查英文用户:
curl -H "Accept-Language: en-US,en;q=0.9" http://yoursite.com/ -I | grep Content-Language - 查简体中文用户:
curl -H "Accept-Language: zh-CN,zh;q=0.8" http://yoursite.com/ -I | grep Content-Language - 响应头中应出现类似
Content-Language: zh-CN或Content-Language: en-US,说明协商成功

















