Http-Headers
是否有可靠的方法來確定 URL 是否返回內容或錯誤?
我有一個業務需求,需要遍歷 URL 列表並辨識返回錯誤的 URL。我編寫了一個簡單的腳本來獲取特定 url 的標頭,因為我不關心內容。我只想知道獲取內容是否有錯誤。在某些情況下,我的腳本會在返回內容的同時返回 503 錯誤。這是一個例子。
$ curl --head https://www.eia.gov/consumption/ HTTP/1.1 503 Service Unavailable Server: AkamaiGHost Mime-Version: 1.0 Content-Type: text/html Content-Length: 175 Expires: Fri, 05 Jan 2018 21:32:47 GMT Cache-Control: max-age=0, no-cache, no-store Pragma: no-cache Date: Fri, 05 Jan 2018 21:32:47 GMT Connection: keep-alive
在沒有“–head”部分的情況下執行相同的 curl 命令會返回一個 HTML 頁面,它不是錯誤頁面。是相關內容。因此,該 503 錯誤具有誤導性。
這是一個配置錯誤的 Web 伺服器返回一個不正確的響應頭還是我遺漏了什麼?
真正的問題是:**是否有可靠的方法來確定 URL 是否返回有效內容或是否返回錯誤?**在這種情況下,HTML 的存在很有用,但我不會指望返回 HTML,這意味著沒有錯誤。404 錯誤是獲取 HTML 頁面的經典案例,但錯誤程式碼告訴我找不到該頁面。
該
--head
選項使curl
發送實際HTTP HEAD
請求。一些伺服器可能不尊重這一點,或者可能不會HTTP GET
像瀏覽器發送的請求那樣路由它。使用該-i
選項將列印響應標頭,但仍會發送GET
請求。這也將返迴響應的整個正文。您可以將其縮減為包含協議版本和響應狀態的第一行,僅使用如下head
命令:$ curl -si https://www.eia.gov/consumption/ | head -n 1 HTTP/1.1 200 OK
(
-s
curl 選項可防止顯示由管道 curl 到另一個程序觸發的下載狀態。head-n
選項是要返回的行數。)如何判斷成功取決於你對“有效”的定義。HTTP 標準認為 200 或 300 範圍內的任何內容都是成功的。如果您想基於此進行檢測,可以這樣使用
grep
:$ curl -si https://www.eia.gov/consumption/ | head -n 1 | grep -E 'HTTP/\d\.\d (2|3)\d\d '
這使用正則表達式匹配以 2 或 3 開頭的任何返回碼。確保不要嘗試匹配 HTTP 協議版本,因為它可能並不總是相同。
一旦你得到 and 返回的行
curl
,head
就有無限可能根據你的實際需要來處理、格式化和返回結果。