首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現 HTTP 303 重定向下載的最佳實踐

     編輯:PHP 綜合知識

核心代碼片段

<?php
if (isset($link)) {
    header("HTTP/1.1 303 See Other");
    header("Location: $link");
    exit;
}
?>

國外專家建議的優化寫法

<?php
// 處理表單...
// 重定向到結果頁
header('Status: 303 See Other');
header('Location: https://www.example.com/result.html');
// 不要在這之後有任何輸出
?>

關鍵差異解析

項目常見寫法推薦寫法理由
狀態行header("HTTP/1.1 303 See Other")header('Status: 303 See Other')Apache 產生的回應頭更標準,避免猜測 HTTP 版本
Location 值相對路徑 result.html完整 URI https://example.com/result.htmlRFC 規定 Location 必須為完整 URI
後續輸出可能有 exit('...') 帶字符串無任何輸出重定向後不應輸出內容,避免客戶端解析異常

完整下載腳本範例

<?php
// download.php
$fileId = $_GET['id'] ?? '';
if (!$fileId) { http_response_code(400); exit('缺少參數'); }

// 業務邏輯:驗證權限、記錄日誌、生成簽名 URL 等...
$downloadUrl = generateSignedUrl($fileId); // 假設函數

// 發送 303 重定向
header('Status: 303 See Other');
header("Location: $downloadUrl");
// 關鍵:立即結束腳本,防止後續輸出干擾
exit;
?>

適用場景

  • 表單提交後避免重複提交(PRG 模式)
  • 大文件下載前驗證權限,再導向 CDN/對象存儲簽名 URL
  • API 回調、OAuth 授權碼流程重定向

常見坑點提醒

  1. 輸出緩衝:若開啟了 ob_start(),重定向前需 ob_end_clean() 或確保無輸出。
  2. Header 已發送:任何 echo、空白行、BOM 都會導致「headers already sent」錯誤。
  3. 相對路徑:某些舊版瀏覽器/爬蟲對相對 Location 支援不佳,統一用絕對 URL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved