多语言站点按浏览器语言跳转导致爬虫无法抓取非英语页面如何解决
解决方案
1. 核心修复:在跳转逻辑前增加爬虫识别判断
直接在现有lang_redirect函数最开头加爬虫UA检测,只要命中爬虫特征就直接跳过跳转逻辑,不会影响正常用户的跳转体验。
修改后的代码示例:
function lang_redirect() { // 新增:爬虫直接跳过跳转 $crawlerKeywords = [ 'googlebot', 'bingbot', 'ahrefsbot', 'semrushbot', 'facebookexternalhit', 'twitterbot', 'linkedinbot', 'slackbot', 'discordbot' ]; $userAgent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? ''); foreach ($crawlerKeywords as $kw) { if (str_contains($userAgent, $kw)) { // 是爬虫,不跳转也不设置cookie,直接返回 return; } } // 原有逻辑保持不变 if (isset($_COOKIE['lang_redirect'])) return; global $lang, $requesturi; $browserlang = getlang($_SERVER['HTTP_ACCEPT_LANGUAGE']); $link = lang_translation_link($browserlang); if (($browserlang != $lang) && ($link != '')) header("Location: " . $link, true, 302); // 建议显式指定302状态码 header("Set-Cookie: lang_redirect=1; Max-Age=86400; Path=/; HttpOnly; SameSite=Lax"); }
注:如果你的PHP版本低于8.0,没有
str_contains函数,可以替换为strpos($userAgent, $kw) !== false实现相同效果。
2. 配套优化建议
- 所有页面的
<head>标签内补充对应hreflang标注,明确告知搜索引擎每个页面对应的语言版本,示例:<link rel="alternate" hreflang="en" href="https://example.com/article123" /> <link rel="alternate" hreflang="fr" href="https://example.com/fr/article123" /> <link rel="alternate" hreflang="de" href="https://example.com/de/article123" /> - 保留页面上的手动语言切换按钮,给需要主动切换语言的用户、以及不支持cookie的特殊客户端使用。
- 可定期更新爬虫关键词列表,覆盖新出现的常见爬虫UA标识。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

