Http-Headers

是否有可靠的方法來確定 URL 是否返回內容或錯誤?

  • January 5, 2018

我有一個業務需求,需要遍歷 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

-scurl 選項可防止顯示由管道 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 返回的行curlhead就有無限可能根據你的實際需要來處理、格式化和返回結果。

引用自:https://serverfault.com/questions/890944