全部產品
Search
文件中心

Object Storage Service:禁止檔案覆蓋寫

更新時間:Dec 05, 2025

當使用者希望OSS Bucket下的檔案在首次上傳後,不能被意外或惡意修改,可以為該Bucket設定禁止覆蓋規則,根據檔案路徑、類型或操作者身份精確控制哪些檔案不可被覆蓋。

  • 首次並發上傳:當一個檔案在首次上傳時是並發的(即多個用戶端同時上傳該檔案),即使它匹配了禁止覆蓋規則,系統也不會阻止其中一個版本成功寫入。這是為了確保高並發情境下的寫入成功率。但在該檔案成功建立後,任何後續的覆蓋操作都將被規則正常攔截。

  • 不攔截系統內部行為:禁止檔案覆蓋的功能僅針對用戶端發起的PutObject、AppendObject等操作。對於由OSS系統自身發起的後台行為,如生命週期(Lifecycle)轉換或跨地區複製(CRR)等,規則不會進行攔截,以保證這些核心功能的正常運行。

  • 不相容版本控制:當Bucket版本控制狀態為開啟或暫停時,禁止覆蓋規則不會生效。

工作原理

當OSS收到檔案覆蓋請求時,系統會按照設定的保護規則進行評估:

  1. 規則匹配:系統按規則建立順序檢查請求檔案路徑是否同時滿足規則中的首碼、尾碼條件,以及操作者身份是否匹配授權使用者設定。

  2. 執行決策:必須同時滿足所有Filter條件(首碼、尾碼)以及操作者身份才會觸發禁止覆蓋操作,返回FileAlreadyExists。

  3. 預設行為:如果所有保護規則都不匹配,則允許正常的檔案覆蓋操作。

為特定檔案類型設定保護

保護生產環境中的設定檔和記錄檔,防止被特定使用者意外覆蓋。

  1. Bucket 列表頁面,單擊目標Bucket名稱。

  2. 在左側導覽列,選擇資料管理 > 禁止檔案覆蓋寫

  3. 單擊新增禁止覆蓋寫規則,配置以下參數:

    • 規則ID:可手動填寫或自動產生

    • 檔案名稱首碼輸入需要保護的目錄路徑,如 production/configs/

    • 檔案名稱尾碼:輸入副檔名,如 .json

    • 授權使用者:指定受限制的子帳號、角色或其他帳號

  4. 單擊確定建立規則。

  5. 驗證規則效果:

    • 使用被限制的帳號嘗試上傳同名檔案到 production/configs/app.json

    • 確認返回FileAlreadyExists

    • 其他使用者或上傳到不滿足前尾碼條件的檔案路徑則正常進行

設定全域保護原則

為關鍵業務資料建立全面保護,防止任何人員誤操作。

  1. Bucket 列表頁面,單擊目標Bucket名稱。

  2. 在左側導覽列,選擇資料管理 > 禁止檔案覆蓋寫

  3. 單擊新增禁止覆蓋寫規則,配置以下參數:

    • 規則ID:可手動填寫或自動產生

    • 檔案名稱首碼critical-data/

    • 檔案名稱尾碼:留空(保護該路徑下所有檔案)

    • 授權使用者:所有帳號(*)

  4. 單擊確定建立規則。

  5. 驗證全域保護效果:

    • 使用任意帳號嘗試覆蓋 critical-data/database.sql

    • 確認返回FileAlreadyExists,表明全域保護生效

    • 上傳到 public-data/ 路徑下的檔案正常覆蓋

匹配規則

  • 規則數量:單個Bucket最多支援100條規則

  • 字元長度:首碼和尾碼最大長度均為1023個字元

  • 前尾碼匹配方式:僅支援精確字串匹配,不支援Regex或萬用字元。輸入的logs/會被當作一般字元處理

  • 首碼匹配logs/ 匹配 logs/app.log,不匹配 dev-logs/app.log

  • 尾碼匹配.txt 匹配 readme.txt,不匹配 readme.TXTreadme.txt.bak

  • 授權使用者匹配:支援萬用字元星號(*),可參考Bucket Policy常見樣本中 Principal 的配置。

  • 條件組合:必須同時滿足規則中的所有Filter條件(前尾碼和授權使用者)才會觸發禁止操作

  • 規則ID:可選項,如不填寫會自動產生UUID。如填寫必須保證在Bucket內唯一

常見問題

設定授權使用者為空白後,連我這個Bucket所有者也無法覆蓋檔案了,怎麼辦?

這是預期行為。授權使用者為空白表示規則對所有使用者生效,包括Bucket的建立者和主帳號。如需恢複覆蓋能力,可以:

  • 在控制台刪除該規則

  • 修改規則的首碼或尾碼條件,縮小保護範圍

  • 設定授權使用者為特定使用者,僅限制部分使用者的覆蓋操作

設定首碼為logs/*.txt想匹配日誌目錄下的所有txt檔案,為什麼不生效?

OSS的前尾碼匹配不支援萬用字元。*會被當作一般字元處理,系統會精確匹配名為logs/*.txt的檔案。正確做法是:

  • 首碼設定為logs/

  • 尾碼設定為.txt

這樣可以匹配logs/目錄下所有以.txt結尾的檔案。

首碼和尾碼都不填寫會怎樣?

當首碼和尾碼都留空時,規則會對整個Bucket生效。這意味著:

  • 如果授權使用者也為空白,則禁止所有使用者對該Bucket內任何檔案進行覆蓋操作

  • 如果授權使用者指定了特定使用者,則僅禁止這些使用者對Bucket內檔案的覆蓋操作