PHP通过读取$_SERVER['HTTP_ACCEPT_LANGUAGE']获取浏览器语言,正则提取语言码后用header()重定向,需在输出前调用并exit,兼顾SEO与用户体验。

PHP识别浏览器语言并自动跳转,核心是读取 HTTP 请求头中的 Accept-Language 字段,再根据语言代码(如 zh-CN、en-US)做判断,用 header("Location: ...") 实现服务端重定向。这种方式准确、可靠,且不依赖 JavaScript,适合在入口文件(如 index.php 或 WordPress 的 header.php)中使用。
读取并解析 Accept-Language
浏览器在每次请求时会自动发送 Accept-Language 头,格式类似:zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
PHP 通过 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 获取该值。注意需先检查变量是否存在,避免未定义警告:
- 用
isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])判断是否可用 - 推荐用正则提取首个有效语言标签,例如:
preg_match('/^([a-z]{2})/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);<br>$lang = $matches[1] ?? 'en'; - 只取前两位(如
zh、en、fr)已能满足大多数场景;如需区分简繁体,可匹配完整子标签(如zh-CN、zh-TW)
按语言跳转对应页面
拿到语言码后,用条件分支决定跳转目标。常见写法包括:
- 简单两级跳转(中文 →
/cn/,其余 →/en/):if ($lang === 'zh') { header('Location: /cn/'); exit; } else { header('Location: /en/'); exit; } - 多语言精细跳转(支持日、韩、法、葡等):
switch($lang) {<br> case 'zh': header('Location: /cn/'); break;<br> case 'ja': header('Location: /jp/'); break;<br> case 'fr': header('Location: /fr/'); break;<br> default: header('Location: /en/'); break;<br>} - 兼容繁体与港澳地区:
可用preg_match('/^zh[-_](?:cn|sg|my)/i', $langStr)匹配简体,/^zh[-_](?:tw|hk|mo)/i匹配繁体
必须注意的关键细节
这类跳转看似简单,但几个细节处理不好会导致 404、循环跳转或 SEO 问题:
-
必须在任何输出之前调用 header():确保跳转代码位于最顶部,前面无空格、BOM、
echo或 HTML - 跳转后务必 exit 或 die:防止后续代码继续执行,造成逻辑混乱
- 不要完全依赖语言头:用户可能用英文系统但懂中文,建议配合语言切换按钮 + Cookie 记住偏好
-
避免对搜索引擎不友好:如果首页强制跳转,建议给爬虫(如 Googlebot)返回默认语言页,或用
rel="alternate" hreflang声明多语言关系
替代方案:JS 客户端跳转(仅作补充)
若无法修改服务器端(如纯静态站点),可用 JS 读取 navigator.language 或 navigator.userLanguage 实现跳转,但存在明显局限:
立即学习“PHP免费学习笔记(深入)”;
- 部分浏览器返回值格式不统一(如
zh-CNvszh-cn),需统一转小写再截取 - 用户禁用 JS 时失效
- SEO 友好性差,爬虫可能抓不到目标页
- 不如服务端跳转快,会有短暂白屏



















