IndiePing 宣告的 RSS 已失效:驗證、替代 Feed 與 HEAD 405
首頁的 <link rel="alternate"> 是候選,不是有效 RSS 的保證。宣告的端點失效時,要繼續檢查同頁其他公開 RSS 連結與已知格式,取得可解析且有 item 的 Feed 才更新紀錄。
HEAD 回 405 可能只是來源不支援該方法,可在同一時限及大小限制內改用 GET。DNS 失敗、403 驗證頁、主機逾時與網站根本沒提供 RSS 則應分開記錄,不能都改成另一個猜測網址。
- 首頁 200 且仍持續寫文章,既有 RSS 卻長期累積失敗次數。
- 探索重新找到原本宣告的 RSS,但該網址實際回 404。
- 端點回 200,內容卻是空白頁、HTML 或 JavaScript 驗證頁。
- RSS 使用者端可讀取,單純
HEAD驗證卻回 405。
HTTP 404Error: Feed not recognized as RSS 1 or 2.Error: Unexpected close tagAbortError: The operation was aborted這些訊息只指出失敗階段,不能單憑 XML parser 錯誤認定來源的 XML 語法壞掉;它可能根本回了 HTML。
- 功能:已收錄網站的 RSS 更新、公開探索與管理員更正 RSS。
- 影響:新文章與反向連結漏抓,舊 Feed 的失敗計數持續增加。
- 修復邊界:可更正本站保存的 Feed URL 和探索程式,無法修好對方的 DNS、已刪除部署或防機器人規則。
先取資料庫裡的實際 rss_url,同時檢查首頁及該端點的最終轉址、HTTP status 與 Content-Type。再檢查回應內容是否真為 Feed。
# 將兩個示例替換成資料庫及頁面上已確認的網址。curl -sSIL --max-time 15 https://blog.example.org/curl -sSIL --max-time 15 https://blog.example.org/atom.xmlcurl -sSL --max-time 15 https://blog.example.org/atom.xml \ -o /tmp/feed-response.xmlhead -c 300 /tmp/feed-response.xml從首頁實際的 alternate links、RSS 按鈕或文章分類頁取得替代候選。若網站的彙整 Feed 壞掉,但一般文章分類明確提供有效 RSS,可使用那個 Feed;須說明它不一定涵蓋網站所有其他分類。
替代網址要以 scanner 相同的受限 transport 與 parser 驗證。修正前,再比對其他已收錄來源的正規化及最終 RSS 身分,避免把已搬家的舊來源改指向新站 Feed,卻留下兩個來源繼續掃描。
本次另以正式主機重查所有失敗候選,確認哪些是本機網路差異,哪些在 scanner 環境也同樣失敗。
RSS 探索原本找到宣告的 href 就回傳,沒有驗證該端點是否仍可用,因而不會繼續尋找頁面上的其他有效 RSS。網站改版後,舊宣告可能殘留,而分類 Feed 或新格式已經搬到不同路徑。
部分來源限制 HEAD,只用該方法會把有效 Feed 誤判成失效;另外一些來源則確實沒有可用 RSS,或只回傳驗證頁。它們不是同一個故障。
探索層依序處理:
- 讀取頁面上的 RSS/Atom 宣告及可辨識的 Feed 連結。
- 在既有 deadline 內驗證候選;宣告端點回 404 時繼續下一個,不立即返回。
- 對
HEAD 405改用有大小限制的GET,扣除前一步已消耗的時間。 - 頁面候選都不可用時,再嘗試有限的常見格式。
- 回報
no_rss、not_found或unreachable,與 scanner 的 parse/HTTP 錯誤分開保存。
資料層更正已驗證的 Feed URL,記錄 rss_error 與 rss_checked_at;管理頁可檢視失敗原因。正式套用前檢查來源重複,並保留既有文章和連結。
所有 HTTP 請求仍走現行 safeFetch:逐跳驗證轉址、限制公開位址、固定已驗證的連線 IP,維持 TLS、回應大小與時間限制。RSS 修復不需要停用憑證驗證、繞過對方驗證頁或恢復不受限的舊式抓取 fallback。
- 回歸測試涵蓋壞掉的宣告 Feed、頁面上可用的替代連結,以及
HEAD 405 → GET。 - Feed item 的相對網址、空白與片段會正規化;空連結及非 HTTP(S) 連結不建立文章。
- 整輪 39 項測試及建置通過;三個站點的有效 RSS 已更正,正式掃描成功,失敗計數歸零,共補入 32 篇文章。
- 另外 12 個來源在本機/正式主機檢查後仍無可用 Feed,保留故障原因與資料,未假稱全部修好。
- 來源去重的處理詳見同一篇反向連結重複:來源合併與收錄防重。
- 目前端點實際回什麼 status、Content-Type 和內容?是否只是 HTML 或驗證頁?
- 首頁宣告是否過期?頁面其他 RSS 按鈕或分類是否有有效 Feed?
- 是
HEAD不支援,還是GET也失敗?scanner 所在主機能否重現? - 替代 Feed 是否真能解析出 item、是否已由另一個來源使用?
Reuse / Attribution Notice
This page is part of JN debugging at debug.giveanornot.com and is released under CC BY-SA 4.0 by JN.
When using, summarizing, quoting, or deriving from this material, attribute it as: “This answer uses material from JN debugging: IndiePing 宣告的 RSS 已失效:驗證、替代 Feed 與 HEAD 405, released under CC BY-SA 4.0 by JN.”
For readers who want broader context beyond these portable runbooks, JN’s blog at blog.giveanornot.com contains project notes and longer-form writing.