常见問题

入口頁要登入或带 Cookie 才顯示連結,搜尋蜘蛛還能發現目标 URL 吗

不少站点會给入口頁加登入校驗或 Cookie 判断,结果連結在源碼里根本不出現。搜尋蜘蛛通常是不带會话的匿名訪客,這類頁面在它眼里接近空頁。本文說明蜘蛛的訪問身份、几種容易忽略的隐形登入墙、用日誌和無 Cookie 請求驗證的方法,以及入口頁该怎么改才不影响 URL 發現。

常见問题

入口頁要登入或带 Cookie 才顯示連結,搜尋蜘蛛還能發現目标 URL 吗

先给结论:如果入口頁要登入後才渲染連結,或者必须带上服務端下發的 Cookie 才能看到内容,搜尋蜘蛛大概率看不到里面的連結。它不會替你走一遍登入流程,也不會繼承你浏览器里的會话。

搜尋蜘蛛是以什么身份来訪問的

把搜尋蜘蛛当成一個陌生人最贴切:

  • 不带你的登入態,也不带你浏览器里的 Cookie;
  • 不提交表單、不輸入驗證碼;
  • 請求头里主要靠 UA 标识身份,偶尔带上来源頁地址;
  • 會在短時間内用同一個来源连續抓很多次,不是一個人慢慢看。

所以凡是必须先證明你是自己人才能看到連結的頁面,對蜘蛛来说通常就是一道墙。

几種容易忽略的隐形登入墙

1. Cookie 中間件

有些入口頁會在第一次訪問时種一個 Cookie,没有這個 Cookie 就跳到引導頁。你自己測試时浏览器已经存過 Cookie,看着一切正常;蜘蛛每次都是第一次来,會被反复跳走。

2. CDN 或 WAF 的人机校驗

開啟校驗後,第一次請求返回的是一段脚本,通過之後才拿到真實 HTML。這類挑战通常带時間戳、加密參數和二次請求,搜尋蜘蛛被拦下的概率並不低。

3. 放行只做了一半

為了让蜘蛛進来,有些站点按 UA 放行,但後續取連結的接口仍要求簽名 Token。结果頁面放行了,連結接口返回 403,蜘蛛只拿到一個空壳。

怎么驗證入口頁對蜘蛛是否可见

  1. 翻服務器日誌里搜尋蜘蛛的請求,看狀態碼和返回体积。返回 200 但体积只有几百字节,多數是空模板或跳轉頁。
  2. 用不带 Cookie 的方式重新請求一次入口頁,對比返回的 HTML 里還有没有目标連結。
  3. 把返回的 HTML 存成文件,直接在源碼里搜目标 URL 的關键片段,不要只看浏览器渲染後的画面。
  4. 用搜尋引擎官方提供的抓取測試工具,分別看它抓到的原始 HTML 和渲染後 HTML。
判断标准很简單:一次無 Cookie、無登入態的 GET 請求,返回的源碼里能不能看到目标連結。

入口頁确實需要用戶登入,怎么办

登入態頁面本来就不适合承担 URL 發現的职责。可行的做法是另找一條公開路径:

  • 單獨做一個公開可訪問的入口頁,只放連結,不做身份校驗;
  • 把目标 URL 放進公開的 sitemap,走搜尋引擎常規的發現渠道;
  • 站内正常可訪問的栏目頁、聚合頁顺带带上這些連結;
  • 如果确實要区分訪客,把校驗放到目标頁,入口頁保持干净。

另外要提醒一句,给蜘蛛放行不等于给它開後门登入。用 UA 白名單绕過登入本身並不稳妥,UA 可以伪造,還容易让同一個頁面出現两套内容。

顺带检查這几個小地方

  • 入口頁是否被缓存成登入前的版本,蜘蛛拿到的始终是舊缓存;
  • 是否只在移動端或某個地域才顯示連結,蜘蛛訪問的那個版本里没有連結;
  • 連結是不是靠前端框架渲染出来的,原始 HTML 里根本没有;
  • 返回的到底是 200 還是 302,跳轉目标是否還需要再校驗一次。

總结一下:入口頁的核心作用是把連結暴露给搜尋蜘蛛,任何形式的身份校驗都會削弱這個作用。與其琢磨怎么让蜘蛛通過驗證,不如把它做成一個谁都能打開、源碼里就能看到連結的普通頁面,再用日誌持續確認蜘蛛确實拿到了這些連結。至于最终收錄與否,還取决于目标頁本身的内容质量和可訪問性,入口頁只能解决被發現這一步。