2026年9月30日 · 閱讀時間 5 分鐘
如何用預先簽署的 URL 分享私人 S3 與 R2 檔案
不是每個檔案都該放在公開的儲存貯體。合約、發票或尚未發布的建置版本可以保持私人,同時仍能透過只在有限時間內有效的連結分享。
預先簽署的 URL 如何運作
這個 URL 包含 S3 檢查請求所需的一切:簽署用的金鑰、簽署時間、有效期限以及簽章。它看起來像這樣:
https://your-bucket.s3.eu-central-1.amazonaws.com/contract.pdf
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Credential=AKIA…/20260930/eu-central-1/s3/aws4_request
&X-Amz-Date=20260930T120000Z
&X-Amz-Expires=3600
&X-Amz-SignedHeaders=host
&X-Amz-Signature=…
簽署在你的電腦上完成。在有人開啟連結之前,不會有任何東西傳送到服務供應商,而且只要改動其中任何部分,簽章就會失效。
用 AWS CLI 建立
aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400
這個連結的有效期為 24 小時。如果是 Cloudflare R2 或其他 S3 相容服務,請把 CLI 指向它的端點:
aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400 \
--endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com需要知道的限制
- 最長 7 天。Signature Version 4 最多允許 604,800 秒,S3 和 R2 都一樣。
- 臨時憑證會更早失效。用 STS 或 SSO 工作階段簽署的 URL,會在該工作階段到期時失效,即使你要求的有效期更長也一樣。
- R2 需要使用 API 網域。R2 上的預先簽署 URL 只能搭配
<ACCOUNT_ID>.r2.cloudflarestorage.com使用,不能搭配自訂網域。 - 任何拿到連結的人都能使用。在它到期之前,請把它當成密碼對待。
- 無法單獨撤銷某個連結。如果要提前讓連結失效,請刪除物件或為它重新命名,或停用簽署它的存取金鑰。
預先簽署的 URL,還是公開儲存貯體?
本來就要給人看、而且應該長久有效的檔案,例如文件中的截圖、README 裡的圖片,請使用公開儲存貯體。任何敏感或短期的檔案則使用預先簽署的 URL。很多人會兩種儲存貯體各準備一個,再依檔案決定。
常見問題
預先簽署的 URL 可以有效超過 7 天嗎?
使用 S3 和 R2 所採用的 Signature Version 4 時不行。如果需要更長時間的存取,請把檔案公開,或在舊連結到期時產生新的連結。
為什麼我的預先簽署 URL 傳回 SignatureDoesNotMatch?
通常是 URL 在簽署後被修改過,例如被電子郵件用戶端改動,或是把主機換成了自訂網域。區域和端點設定也必須與儲存貯體相符。
預先簽署的 URL 適用於 Backblaze B2 和 MinIO 嗎?
適用。兩者都透過各自的 S3 相容 API 支援 Signature Version 4 預先簽署的 URL。