萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux curl 處理 HTTP 302 重導向失敗?根因分析與解決方案

問題現象

使用 curl -I 獲取頭資訊時遇到 HTTP 302 重導向,提取 Location 欄位的新 URL 再次請求卻回傳 HTTP 400 Bad Request,但手動複製該 URL 請求卻正常(200 OK)。

根因分析

透過 hexdump 比對發現:

  • 從回應頭擷取的 URL 結尾含 0A(LF 換行符)
  • 手動複製的 URL 結尾為 0D 0A(CRLF)或無控制字元
  • 殘留的 LF 導致 HTTP 請求行格式錯誤,伺服器回傳 400

錯誤指令示範

URL=$(cat log | grep '^Location' | cut -f2 -d ' ')
curl -s -I "$URL" > log  # 含換行符,請求失敗

正確解決方案

方法一:使用 sed 移除換行符(推薦)

URL=$(cat log | grep '^Location' | cut -f2 -d ' ' | sed 's/\r//; s/\n//')
curl -s -I "$URL" > log

方法二:使用 tr 刪除控制字元

URL=$(cat log | grep '^Location' | cut -f2 -d ' ' | tr -d '\r\n')
curl -s -I "$URL" > log

方法三:啟用 curl 內建重導向追蹤(最簡單)

curl -s -L -I "原始URL" > log
# -L 參數自動追蹤 3xx 重導向,無需手動解析 Location

最佳實踐建議

  • 優先使用 -L 參數 讓 curl 自動處理重導向鏈
  • 若需中間處理,務必清理變數中的控制字元(\r、\n、\r\n)
  • 使用 printf '%s' "$URL" 而非 echo 輸出變數,避免殘留換行
  • 撰寫健壯腳本時加入 set -euo pipefail 並驗證 URL 格式

延伸知識:curl 重導向相關參數

參數說明
-L跟隨重導向(預設最多 50 次)
--max-redirs N設定最大重導向次數
--post301/--post302/--post303重導向時保持 POST 方法不轉為 GET
-H "Referer: ..."攜帶 Referer 頭,某些防盜鏈需求

理解 HTTP 協議細節與 Shell 變數處理特性,能避開此類「看似玄學實則細節」的坑。

copyright © 萬盛學電腦網 all rights reserved