很多站点為了統計广告投放效果或防止接口被恶意調用,會在網址後面挂上带有時間戳、随机數或用戶标识的簽名參數。例如:/product/123?from=fb&ts=1728892800&token=a9f8e7。這類參數本身可能並不影响服務器返回的内容,每次訪問时值都會變化,于是同一個产品頁面對奔走的搜尋蜘蛛来说,就變成了無數個不同的URL。
動態簽名參數如何干扰URL發現
搜尋蜘蛛的URL發現机制依赖等号、文本结构以及之前见過的地址。当蜘蛛從某一頁看到一個带參數的連結並记錄後,下一次爬行时這個連結地址可能已经改變。它無法判断新地址是同一個頁面,只能把每一次出現的地址都当作新的URL来處理。于是會反复請求,反复“發現”新的地址,最终導致:
- 同一篇内容以大量不同URL的形式存在,權重被稀释;
- 抓取预算浪費在反复拉取相同的内容上,真正重要的URL得不到及时爬取;
- 站内搜尋结果中可能出現同一内容的多個條目,且带有的動態參數让頁面相似度极高,降低頁面质量感知。
動態簽名URL對抓取最大的影响,不是“抓不到”,而是每次都“像新的一样”,使蜘蛛的路径收敛机制完全失效。
從蜘蛛池的视角观察異常現象
使用蜘蛛池模拟搜尋爪牙進行遍歷时,能清楚看到這種問题。如果我們在一個简單的目錄頁里人為加入一组带不同時間戳的連結指向同一篇文章,池子里的數字日誌會记錄下每一次請求都被当作新地址處理,返回200且頁面主体完全相同。去掉時間戳後再次測試,第二次請求里蜘蛛會识別出這是一條已走過的URL,並且會在日誌中呈現一個“已抓取”标记。蜘蛛池的這一對照實驗直观驗證了“簽名參數更新導致路径無法回溯”的事實。
此外,当站点内鏈系統無法给某個产品提供一個固定的引用地址时,蜘蛛很难在两次爬行間记住這個頁面,也就無法形成更新周期。例如用戶分享、营销活動落地頁有时會使用一次性token来标识流量来源,但蜘蛛在抓取這些可疑地址时,如果内部連結自然指向的都是带token的變体,就會造成核心内容被迫以“一次性URL”的形式存在。
如何让搜尋蜘蛛重新回到稳定的URL路径上
優先确保站内主入口使用干净URL
從首頁、频道頁、分類頁等主要内鏈的锚点地址,必须保證固定參數最多只保留语义化且可改變内容的键,如颜色、頁碼等,而不带請求時間、随机數或會话ID。對于按钮、JS動態跳轉或广告落地頁面,尤其要控制連結的生成規則,让網站後端在原生HTML中给出稳定的href属性。
利用canonical标簽声明主版本
在動態簽名URL對應的也頁面HTML中,加上指向该頁面唯一“規范化”地址的<link rel="canonical" href="">。這样做能有效告诉搜尋机器人,即使你訪問的是带參數的地址,所有排名和聚合信息應以主URL為准。對于大量已产生的外部推廣連結,無需逐一修改,只要服務器正确輸出该标记,就可以逐渐把參數URL上的抓取權重收拢到主URL上。
在Sitemap中只提供規范的URL
Sitemap文件是搜尋蜘蛛最直接信任的URL列表。如果Sitemap里也只放带簽名參數的新鲜地址,那么蜘蛛每次都會当作新URL来爬,等于自砍预算。必须让後台程序生成Sitemap时强制去掉簽名與統計參數,輸出干净的頁面地址。同时可以在Sitemap维護日誌中观察每個URL的“最後抓取時間”,用来核實是否仍有分叉。
利用301或robots規則處理已生成的废弃參數URL
對于已经被搜尋引擎收錄、且带有明顯簽名參數的歷史URL,可通過服務端301跳轉让參數URL直接指向規范URL,把舊地址的抓取记錄和連結權重统一合並。若由于技術原因不便跳轉,則可在robots.txt中暂时禁止带有ts=或token=參數的路径,防止蜘蛛繼續爬取這些無效變体。不過要谨慎使用disallow,因為一旦禁止包含參數的路径,也可能會阻止部分正常執行需要的參數化URL(如翻頁),可以僅针對固定的參數名做控制。
日誌监控與定期漏洞掃描
在蜘蛛池或服務器日誌分析工具中,篩選“同一頁面不同URL都返回200且内容長度相同”的记錄,列出重复URL數量及最常见參數键。如果重复率大于10%,說明站内存在模板級的連結生成错誤。建议每周做一次自查,模拟搜尋引擎的抓取方式,從首頁和主要入口抓取两层連結,統計出重复比例。
誤用簽名參數的常见陷阱
- 為了較精确地跟踪用戶浏览轨迹,刻意在頁面連結中寫入目前會话ID,希望統計到点击行為。但應改為用本地Cookie儲存會话ID,而不是暴露在URL内。
- 把時間戳作為缓存分發的依據,用加參數的方式绕過CDN缓存。可改為通過Cache-Control响應头控制缓存,而不是在連結上做文章。
- 認為服務器端忽略參數即可“多此一举”不出問题。事實上搜尋引擎收錄行為以URL字符串為准,服務器解析後返回相同内容並不能避免重复URL被分別索引。
平衡風險與收益
在某些特殊业務中,如分頁加载带動態滚動條參數、电商站异步篩選组件中生成带随机部件的連結,确實無法完全去除參數。此时可考虑將所有不可缓存的參數统一改為片段标识符(即#後面的部分),因為片段标识符不會随HTTP請求發送给服務器,在搜尋引擎看来属于同一個頁面地址。但注意這種做法只适用于纯前端交互行為,不能承担後端必要的业務資料传递。
一切改動的前提是要保證用戶体驗與业務追踪不受损。更好的做法是設定两套URL:一套给用戶点击和内部逻辑使用,另一套在模板輸出时通過重寫規則轉換為干净静態地址供抓取和展示。
實践中保持克制
不要為了美观而盲目做静態化改造,也不要因為存在少量參數就全盘引入URL重寫。判断标准是:頁面核心指标變量只取决于唯一一個URL路径,任何添加的時間戳、token都會導致抓取结果不稳定。若無法避免,請務必在服務器响應中設定“Content-Location”指定實际主路径,並在頁面内注明canonical,形成一套让蜘蛛認识主要地址的机制。通過持續监测和蜘蛛池模拟,最终達到抓取路径清晰、预算回收的效果。