应通过URL路径优先提取语言码,白名单校验后fallback至en,文案存独立数组或JSON,输出前用htmlspecialchars转义;同时必须设置Content-Language响应头并生成完整hreflang标签集。

怎么让 PHP 动态输出不同语言的 <meta name="description">
关键不是“换内容”,而是“换来源”——得从请求语言标识出发,查到对应文案,再塞进 HTML。硬编码多套 <meta> 标签会失控,也违反 SEO 基本原则(每个 URL 应有唯一、精准的描述)。
常见错误现象:$_SERVER['HTTP_ACCEPT_LANGUAGE'] 直接当最终语言用;没 fallback 导致英文站返回空 description;把翻译文本全写死在 PHP 里,改一个词要改三处。
- 优先用 URL 路径标识语言(如
/en/about、/zh/about),比靠 header 更可靠、更利于爬虫识别 - 语言代码必须标准化:用
en、zh、ja,别用english或zh-CN(除非你真做了区域细分且配置了 hreflang) - description 文案建议存在独立数组或 JSON 文件里,按
lang => [ 'title' => ..., 'description' => ... ]结构组织,避免散落在模板中
PHP 怎么安全地读取当前请求语言并 fallback 到默认值
不能信任用户发来的任何语言线索,必须白名单校验 + 明确 fallback。否则可能输出 <meta name="description" content="<script>..."> 这种 XSS 风险内容。
使用场景:用户访问 /about 但没带语言前缀,或浏览器发来 fr-CH,fr;q=0.9,en;q=0.8 这种复杂 Accept-Language。
立即学习“PHP免费学习笔记(深入)”;
- 先从路径提取语言(如
preg_match('#^/([a-z]{2})/#', $_SERVER['REQUEST_URI'], $m)),匹配不到再看$_GET['lang'],最后才考虑$_SERVER['HTTP_ACCEPT_LANGUAGE'] - 校验语言码必须用白名单:
in_array($lang, ['en', 'zh', 'ja', 'ko'], true),不接受zh-Hans这类变体,除非你真有对应文案 - fallback 到
en是最稳妥选择,别设成“自动猜”,更别留空 - 所有输出到 HTML 的文案必须过
htmlspecialchars($text, ENT_QUOTES, 'UTF-8'),特别是 description 和 keywords
hreflang 标签怎么用 PHP 自动生成且不出错
hreflang 不是可选项,是多语言 SEO 的硬性要求。漏掉或写错会导致 Google 把不同语言页当成重复内容处理。
容易踩的坑:hreflang="en-us" 写成小写 us(应为 US);自动生成的链接没带协议和域名,导致相对路径被解析错;同一页面多个 hreflang 指向相同 URL。
- hreflang 值格式固定:
en(仅语言)、zh-Hans(语言-文字)、ja-JP(语言-国家),注意大小写规则(国家码必须大写) - 生成链接时用
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . str_replace($current_lang, $target_lang, $_SERVER['REQUEST_URI']),确保绝对 URL - 每个语言版本都要包含完整 hreflang 集合,包括自己(
<link rel="alternate" hreflang="zh" href="https://example.com/zh/about">) - 别把 hreflang 和 canonical 搞混:canonical 指向自身,hreflang 指向其他语言版本
为什么不能只靠 PHP 输出 meta,还得配好服务器响应头
PHP 只管生成 HTML,但搜索引擎和浏览器判断页面语言,第一眼是看 Content-Language 响应头。光改 meta 标签,不设 header,等于只贴了标签没盖章。
性能影响很小,但兼容性极关键:部分老旧爬虫、RSS 阅读器、无障碍工具依赖这个 header 做初始语言判定。
- 必须在输出任何 HTML 前调用
header('Content-Language: zh'),值和当前页面语言一致 - 不能用
<meta http-equiv="Content-Language" content="zh">替代,HTML5 已废弃该用法,且不起作用 - 如果用了 CDN 或反向代理,确认它没覆盖或删除这个 header(Nginx 默认不删,Cloudflare 可能会)
最麻烦的点其实不在 PHP 逻辑,而在文案同步——每次加一个新语言,不只是改代码,还要核对所有页面的 title/description/keywords/hreflang 是否全部到位,漏一条就可能让某语言页在搜索结果里消失。这事没法全自动,得有人盯。











