Apache .htaccess 实现多语言网站的浏览器语言检测与URL重写
多语言网站在全球化的今天越来越常见。为了让用户自动访问最适合其语言偏好的页面,可以利用 Apache 的 .htaccess 文件实现浏览器语言检测和 URL 重写。这种方法无需服务器端脚本(如 PHP)即可完成,部署简单且高效。
核心原理:基于 Accept-Language 请求头
浏览器在发送 HTTP 请求时,会携带一个 Accept-Language 请求头,其中包含用户语言偏好列表及其优先级。例如:
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Apache 的 mod_rewrite 模块可以通过 RewriteCond 指令匹配该头部,从而判断用户首选语言。
实现步骤
下面是一个典型的 .htaccess 配置,它实现了以下功能:
- 检测浏览器首选语言是否为中文(zh)或英文(en)
- 将用户重写至对应语言的子目录(如 /zh/ 或 /en/)
- 保留原始路径,实现友好的 URL 结构
- 确保已经处于正确语言目录下的用户不会再次被重定向
完整的 .htaccess 代码示例
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# 如果请求本身已经包含语言前缀,则跳过语言检测
RewriteCond %{REQUEST_URI} ^/(zh|en)(/|$) [NC]
RewriteRule ^ - [L]
# 检测 Accept-Language 是否包含中文(优先)
RewriteCond %{HTTP:Accept-Language} ^zh [NC,OR]
RewriteCond %{HTTP:Accept-Language} zh- [NC]
RewriteRule ^(.*)$ /zh/$1 [L,R=302]
# 检测 Accept-Language 是否包含英文
RewriteCond %{HTTP:Accept-Language} ^en [NC,OR]
RewriteCond %{HTTP:Accept-Language} en- [NC]
RewriteRule ^(.*)$ /en/$1 [L,R=302]
# 默认回退:如果以上都不匹配,则使用英文
RewriteRule ^(.*)$ /en/$1 [L,R=302]
</IfModule>代码说明
第一段规则:跳过已有语言前缀的请求。如果 URL 以 /zh/ 或 /en/ 开头,则立即停止重写(L 标记),避免进入无限重定向循环。
第二段规则:检测中文偏好。利用 RewriteCond %{HTTP:Accept-Language} 匹配请求头。如果以 zh 开头或包含 zh-,则将请求重写至 /zh/ 目录。注意这里使用了 [NC] 忽略大小写,[OR] 表示两个条件之一满足即可。
第三段规则:检测英文偏好,逻辑与中文类似。
第四段规则:默认回退。如果浏览器语言不是中文也不是英文(或者请求头不存在),则默认跳转到英文版本。
两个规则都使用了 R=302 临时重定向。在实际生产环境中,如果语言检测稳定,可改为 R=301 永久重定向,以利于搜索引擎收录。
注意事项与优化
1. 语言检测的优先级
上面的配置中,中文规则写在英文规则前面,因此如果浏览器同时支持中文和英文(q 值影响),将优先显示中文版本。如果需要严格根据 q 值排序,建议使用更复杂的 RewriteCond 组合,或者考虑服务器端脚本处理。
2. 防止重写循环
务必包含第一条跳过规则,否则用户访问 /zh/xxx 时可能会被再次匹配并重定向,造成循环。也可以通过 ENV:REDIRECT_STATUS 环境变量来避免。
3. URL 路径的保留
上述配置将原始路径(如 /about)附加到语言目录后(如 /zh/about)。如果你的站点采用不同的 URL 映射方式(如 /zh-about),则需要调整 RewriteRule 的模式。
4. 静态文件与缓存
为避免资源文件(CSS、JS、图片)被错误重定向,可以添加条件排除常见文件后缀。例如在语言检测之前添加:
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif|ico|svg|woff2?)$ [NC]
RewriteCond %{REQUEST_URI} !^/assets/这样可以保证静态资源不受语言重定向影响,提升加载速度。
5. 跨域与 Cookie 替代方案
如果用户手动切换语言,通常需要将选择保存在 session 或 cookie 中,并优先于浏览器语言。上述 .htaccess 方案无法直接处理 cookie,此时需要结合服务器端语言(如 PHP)实现更完善的逻辑。
实际应用案例
假设你有一个多语言站点 https://www.ipipp.com,文件结构如下:
/ ├── .htaccess ├── zh/ │ ├── index.html │ └── about.html ├── en/ │ ├── index.html │ └── about.html └── index.html (默认英文首页)
当一位中国用户使用浏览器访问 https://www.ipipp.com/about 时,.htaccess 会检测到 Accept-Language: zh,自动 302 重定向到 https://www.ipipp.com/zh/about,用户看到的是中文版“关于”页面,体验流畅。
总结
通过 Apache 的 .htaccess 实现浏览器语言检测与 URL 重写,是一种无需后端逻辑的轻量级解决方案。它适用于中小型多语言网站,尤其是纯静态页面。配置时需要注意重定向循环、静态资源排除以及语言优先级等问题。若需更精细的控制(如用户手动选择、cookie 记录),则建议配合 PHP、Python 或 Node.js 等服务器端脚本完成。
此外,如果你希望 URL 结构更简洁(如 ippipp.com/zh/about),可以将语言代码作为目录前缀,并在内部正确处理文件路径。上述示例已经展示了最常用的模式,你可以根据自身项目需求灵活调整。