常见問题

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

入口頁能打開,不代表搜尋蜘蛛能看到里面的目标連結。本文說明為什么依赖 Cookie 或登入態的入口頁常常對搜尋蜘蛛無效,並梳理几種常见寫法的實际後果、無 Cookie 請求的自查方法,以及在入口頁需要訪問控制时的折中做法。

常见問题

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

做蜘蛛池入口頁时,有一類問题经常被忽略:頁面本身能打開,但目标連結是在“有會话”的情况下才渲染出来的。比如先 Set-Cookie 再跳轉、必须带某個 Cookie 才輸出連結,或者靠前端脚本先寫 Cookie 再拉取列表。這類设計對人訪問看不出問题,但對搜尋蜘蛛来说,往往就是“頁面是空的”。

搜尋蜘蛛的請求基本是無狀態的

主流搜尋引擎的抓取程序在抓一個新 URL 时,通常不會携带你浏览器里的 Cookie。它更像一個干净的 HTTP 客戶端:發一個 GET 請求,拿回响應,然後解析里面的連結。第一次訪問时不會有你站点設定的會话 Cookie,也不會走你為老訪客准备的“已经是會員”分支。

所以只要你的入口頁把連結輸出逻辑挂在“Cookie 存在”這個條件上,第一次抓取拿到的就是没有連結的那一版。搜尋蜘蛛可能後續再訪問,但如果每次都是全新會话,它就一直看不到那部分内容。

几種常见實現,分別會發生什么

  • Set-Cookie 後 302 跳轉:第一次請求返回 302 加 Cookie,跳轉後的頁面才有連結。搜尋蜘蛛會跟随一次跳轉,但第二次請求通常仍不带 Cookie,可能又回到 302,形成循环或停在中間頁。
  • session 判断後再輸出:如果連結只在會话變量有值时才輸出,搜尋蜘蛛拿到的是空列表或“請先登入”的提示文字。
  • 前端寫 Cookie 再渲染:脚本执行需要時間,且搜尋蜘蛛對 JS 的渲染能力有限,連結能否被發現取决于渲染队列,稳定性差。
  • 按 UA / Referer / IP 做過滤:這類判断只要寫错一個條件,就會把搜尋蜘蛛的請求当成異常流量,直接返回空頁或驗證頁。

怎么自己驗證

不用等日誌,直接用不带任何 Cookie 的請求测一遍最直观。命令行里請求入口頁时故意不带 Cookie 參數,看返回的 HTML 里有没有目标連結:

curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://example.com/entry | grep -c "目标域名"

如果計數是 0,說明連結根本没出現在首次响應里。再換成不带 UA 的普通請求测一次,两次结果如果差別很大,就要检查是否存在 UA 判断。

需要訪問控制时怎么折中

如果入口頁确實不想被普通訪客随便看,可以做分层,而不是把所有逻辑压在同一個條件上:

  1. 把入口頁做成無狀態頁面,目标連結直接寫在首次返回的 HTML 里,不依赖 Cookie 或會话。
  2. 需要限制的只是“人看到的样子”,可以用样式、跳轉或前端交互處理,但別让連結本身消失。
  3. 如果使用 UA 白名單放行搜尋蜘蛛,要同时校驗真實来源 IP,避免被伪造 UA 的采集器蹭到,也不要只靠 UA 字符串做安全判断。
  4. 入口頁不要放在需要 Basic Auth 或登入後才能訪問的目錄下,這類頁面搜尋蜘蛛一般拿不到内容。

小结

入口頁的核心作用是让搜尋蜘蛛顺着連結發現目标 URL,任何“先建立會话再给内容”的设計都在增加這一环节的不确定性。把連結放進首次响應、保持頁面無狀態,是更省心的做法。当然,發現並不等于收錄,最终能不能進索引還要看目标頁自身的内容质量,入口頁只能解决“被發現”這一段。