WordPress「抱歉,基於安全性的考量,不支援這個檔案類型。」解決方法(2026)
TL;DR
最乾淨的解法是在 functions.php 或自訂外掛加入 upload_mimes 過濾器。如果是 iPhone 的 HEIC 照片,用 SnapPress 在裝置端轉成 JPEG 再上傳,就能徹底避開這個錯誤。
簡短回答:這個錯誤代表 WordPress 沒有把該檔案的副檔名或 MIME 類型認定為允許的格式。最乾淨的永久解法是在 functions.php 或自訂外掛加入一小段 upload_mimes 過濾器。如果你上傳的是 iPhone 的 HEIC 照片,最簡單的路徑是上傳前用 SnapPress 這類工具在裝置端轉成 JPEG。絕對不要把 ALLOW_UNFILTERED_UPLOADS 寫進 wp-config.php 當作永久解法——它會關閉 WordPress 所有的上傳安全檢查。
如果你在 WordPress 上遇到「抱歉,基於安全性的考量,不支援這個檔案類型。」,你不孤單。這是全球搜尋量最高的 WordPress 錯誤訊息之一,而且措辭很容易誤導——WordPress 並沒有偵測到任何惡意內容。它只是撞上了一份固定的允許清單,而你的副檔名或 MIME 類型不在清單上。
本指南會說明這個錯誤發生的原因、4 種經過實際營運驗證的永久解法、各個做法的安全取捨,以及針對每種檔案類型的具體解決方案。讀完之後,你會清楚知道哪種方法適合你的情況,以及如何在過程中避免弄壞網站。
為什麼會發生這個錯誤(MIME 類型允許清單)
WordPress 的每一次上傳都會經過 wp_check_filetype_and_ext() 函式。這個函式會把兩件事和固定的允許清單做比對:
- 副檔名(檔名中句點後面的部分)
- 由 PHP 的
finfo擴充功能偵測出的 MIME 類型
只要其中一項不在 get_allowed_mime_types() 回傳的清單裡,上傳就會被拒絕,並顯示「抱歉,基於安全性的考量,不支援這個檔案類型。」。這份清單定義在 wp-includes/functions.php,預設約有 60 個項目——常見的圖片、影片、音訊、壓縮檔和文件格式。
之所以用「安全性」來包裝,是因為允許清單原本的目的是防止攻擊者上傳可執行的程式碼(PHP 檔案、shell script),再讓 WordPress 把它們當作 URL 提供出去。就這個狹義來說,這個過濾機制確實是一道安全防線。但同一個過濾機制也擋下了一長串正當格式,只因為它們沒被收進核心清單:
- HEIC——iPhone 照片(WordPress 6.7 加入,2024 年底)
- WebP(WordPress 5.8 加入,2021 年)
- AVIF(WordPress 6.5 加入,2024 年 3 月)
- SVG(從未加入——需要外掛或過濾器)
- WOFF/WOFF2 字型(從未加入)
- STL、OBJ、GLB 3D 模型格式(從未加入)
如果你的 WordPress 版本早於某個格式被加入的時間點,或者你的主機商跑的是移除了較新 MIME 類型的客製化版本,即使是理應支援的格式,你也會遇到這個錯誤。
暫時的應對:先檢查副檔名和檔案本身
在更動伺服器設定之前,先排除兩個單純的原因:
副檔名錯誤或遺失
從通訊軟體匯出的檔案有時會遺失副檔名,或被加上 .bin 這類通用副檔名。在檔案上按右鍵,重新命名為正確的副檔名(.jpg、.png 等),再試一次上傳。如果成功了,代表檔案內容沒問題,問題只出在副檔名。
檔案已損毀
如果瀏覽器是從聊天室或電子郵件下載檔案,而下載過程被中斷,檔案可能是不完整的。PHP 的 finfo 會偵測到錯誤的 MIME 類型——因為檔案看起來像二進位垃圾而不是圖片。請從來源重新下載原始檔案再試一次。
這兩項檢查只要 30 秒,就能解決我看到的「不支援這個檔案類型」回報中大約 20% 的案例。剩下的 80% 是真正的允許清單問題,需要下面其中一種永久解法。
4 種永久解法
解法 1:透過 upload_mimes 過濾器加入 MIME 類型(推薦)
這是實際營運上最乾淨的解法。把以下程式碼加進子佈景主題的 functions.php,或者——更好的做法——加進一個小型自訂外掛,讓變更在佈景主題更新後也能存活:
<?php
add_filter('upload_mimes', function($mimes) {
$mimes['heic'] = 'image/heic';
$mimes['heif'] = 'image/heif';
return $mimes;
});
add_filter('wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) {
$filetype = wp_check_filetype($filename, $mimes);
if (in_array($filetype['ext'], ['heic', 'heif'], true)) {
$data['ext'] = $filetype['ext'];
$data['type'] = $filetype['type'];
}
return $data;
}, 10, 4); 把 heic 和 image/heic 換成你需要的副檔名和 MIME 類型。第一個過濾器把該類型加進允許清單。第二個過濾器處理一個微妙的 bug:在許多伺服器上,PHP 的 finfo 會把不常見的 MIME 類型回報為 application/octet-stream,導致即使副檔名已被允許,wp_check_filetype_and_ext() 仍然拒絕上傳。第二個過濾器會在副檔名相符時強制完成識別。
想看專門針對 HEIC 的深入教學,請參考 WordPress Allowed MIME Types: How to Enable HEIC Uploads (2026 Guide)。
解法 2:使用外掛(WP Add Mime Types)
如果你不想編輯 PHP,WP Add Mime Types 外掛(免費、80,000+ 安裝、自 2014 年持續維護)提供了一個設定面板,只有兩欄:副檔名和 MIME 類型。新增一列、儲存,就完成了。這個外掛底層執行的是同一個 upload_mimes 過濾器。
兩個經過實際營運驗證的替代方案:
- File Upload Types by WPForms——以核取方塊操作的介面,內建 HEIC、WebP、AVIF、SVG 等 40 多種格式的預設項目。如果你記不住 MIME 類型字串,這是最好的選擇。
- Disable Real MIME Check——單一功能外掛,直接關閉 PHP 的
finfo驗證步驟。在副檔名已在允許清單上、但finfo回報錯誤 MIME 類型的極端案例中很有用。請謹慎使用;代價是驗證變弱。
解法 3:wp-config.php 的 ALLOW_UNFILTERED_UPLOADS(進階,附警告)
WordPress 在 wp-config.php 留了一道逃生門:
define('ALLOW_UNFILTERED_UPLOADS', true); 設定這個常數之後,管理員可以上傳任何檔案類型,包括 PHP 指令碼。所有 MIME 類型檢查都會被略過。
不要在正式環境使用。這個常數會關閉 WordPress 所有的上傳安全檢查。攻擊者只要入侵任何一個管理員等級的帳號,就能把 PHP 檔案直接上傳到 wp-content/uploads 並執行。即使是今天看起來安全的環境,也常常留有舊外掛或匯入作業遺下、被遺忘的「掛著管理員角色的訂閱者」帳號。
唯一正當的用途是在本機開發環境除錯上傳行為。推送到測試環境之前請把它註解掉。
解法 4:用 SnapPress 在裝置端轉換(iPhone 使用者)
特別是 iPhone 照片上傳,最穩健的解法是在檔案抵達伺服器之前,就在裝置上把 HEIC 轉成 JPEG。SnapPress 會從你的照片圖庫讀取 HEIC,使用 Apple 在每個 iOS 版本都持續維護的 iOS 影像管線解碼,再透過 REST API 把 JPEG 上傳到你的 WordPress 媒體庫。
你的 functions.php 完全不用動。你的 upload_mimes 過濾器也完全不用動。抵達伺服器的檔案是 2003 年以來每個 WordPress 安裝都支援的標準 JPEG。
對於管理多個 WordPress 網站、或不習慣編輯 PHP 的人,這是我推薦的路徑。代價是它只解決 iPhone HEIC 的情境——其他檔案類型仍然需要解法 1-3 其中之一。
各檔案類型的解法
精確的 MIME 類型很重要。以下是最常撞上「抱歉,基於安全性的考量,不支援這個檔案類型。」的格式,以及經過實際營運驗證的設定項目。
HEIC(iPhone 照片)
$mimes['heic'] = 'image/heic';
$mimes['heif'] = 'image/heif'; 兩個都要加。iPhone 偶爾會為連拍和影像序列產生 .heif 檔案。加入過濾器之後,WordPress 的上傳會成功——但大多數訪客的瀏覽器無法顯示 HEIC,所以你還需要伺服器端轉換(ShortPixel)或客戶端轉換(SnapPress)。完整說明請見 iPhone HEIC 照片和 WordPress。
WebP
$mimes['webp'] = 'image/webp'; WordPress 5.8(2021 年中)把 WebP 加進了核心允許清單。如果你的 WordPress 是新版,這個過濾器就不需要。如果你用的是舊版本或有客製化限制的主機,這個過濾器可以解除 WebP 上傳的封鎖。
SVG
$mimes['svg'] = 'image/svg+xml';
$mimes['svgz'] = 'image/svg+xml'; 不要只加過濾器就停手。SVG 是 XML,可以內嵌會在管理員瀏覽器中執行的 JavaScript。請務必安裝 Safe SVG 外掛(免費),它會把 SVG 加進允許清單,同時透過 svg-sanitizer 函式庫淨化傳入的檔案,移除 script 標籤、事件處理器和外部實體參照。如果只有信任的設計師需要上傳 SVG,請把過濾器包進 current_user_can('manage_options') 檢查裡。
AVIF
$mimes['avif'] = 'image/avif'; WordPress 6.5(2024 年 3 月)把 AVIF 加進了核心允許清單。只有舊版安裝或客製化主機才需要這個過濾器。在相同的感知品質下,AVIF 比 HEIC 小約 20%,瀏覽器支援也更廣,所以如果伺服器有 libavif,AVIF 是更好的發佈格式。
MP4 影片
$mimes['mp4'] = 'video/mp4';
$mimes['m4v'] = 'video/mp4';
$mimes['mov'] = 'video/quicktime'; 這些通常已在核心允許清單裡,但如果你偏偏在 MP4 上遇到這個錯誤,常見原因是檔案的 MIME 類型被偵測成 video/x-m4v 或 application/octet-stream。加上解法 1 的 wp_check_filetype_and_ext 過濾器來強制識別。
ZIP 壓縮檔
$mimes['zip'] = 'application/zip';
$mimes['7z'] = 'application/x-7z-compressed'; ZIP 預設在核心允許清單裡,但有些安全外掛(Wordfence、Sucuri)會覆寫這個設定,因為 ZIP 可能包含可執行的內容。除了 WordPress 過濾器,也要在安全外掛的設定中把它加入白名單。
安全性考量(為什麼預設要限制)
WordPress 預設限制檔案類型的核心原因只有一個:在大多數伺服器組態下,wp-content/uploads 裡的 PHP 檔案可以被當作程式碼執行。如果 WordPress 接受任何副檔名,攻擊者只要入侵任何一個作者或投稿者帳號,就能上傳 .php 後門、存取它的 URL,在你的伺服器上執行任意程式碼。
允許清單是成本最低的防線。即使其他所有安全層都失守——密碼重複使用、外掛漏洞、供應鏈入侵——上傳過濾器仍能阻止 PHP 進入 uploads 目錄。
往允許清單加東西時的三個原則:
- 只加你真正需要的。如果你一個月才上傳一次 HEIC,就只加 HEIC。不要預先允許所有「也許哪天會用到」的格式。
- 絕對不要允許 PHP、可執行檔或指令碼的副檔名。
.php、.phtml、.exe、.sh、.cgi、.pl——無論任何情況,這些都不該出現在wp-content/uploads。 - 對允許內嵌內容的格式做淨化。SVG(JavaScript)、PDF(JavaScript 動作)、HTML(全部)。使用淨化外掛,或在上傳時轉成扁平的圖片格式。
解法 1 沒有生效時的診斷
你加了過濾器、上傳了檔案,卻仍然看到「抱歉,基於安全性的考量,不支援這個檔案類型。」。請檢查三件事:
過濾器放錯了地方
確認包含過濾器的檔案真的有被載入。如果你把它放在子佈景主題的 functions.php,但目前啟用的是父佈景主題,那段程式碼就不會執行。把它移到自訂外掛,就能消除對佈景主題的相依性。
安全外掛覆寫了允許清單
Wordfence、Sucuri、iThemes Security 這類外掛會在 WordPress 核心之上加入自己的上傳驗證。除了你的 upload_mimes 過濾器之外,也要在安全外掛的設定中把該 MIME 類型加入白名單。
PHP finfo 回報了錯誤的 MIME 類型
這是最常見的無聲失敗。副檔名在允許清單上,但 PHP 的 finfo 模組回傳的不是預期的 MIME 類型,而是 application/octet-stream。WordPress 看到兩者不一致就拒絕。解法 1 的 wp_check_filetype_and_ext 過濾器就是處理這種情況的。請確認它和 upload_mimes 過濾器是一起加入的,不是分開放。
關於 WordPress 上傳失敗更完整的診斷清單,請見 Cannot Upload Images to WordPress? 8 Causes and How to Fix Each One。
iPhone 照片上傳:完全避開這個錯誤的工作流程
上面所有內容,講的都是把原始 HEIC、SVG、AVIF 等格式直接上傳到 WordPress 媒體庫的情況。但針對 iPhone 照片的工作流程,有一條更簡單的路:上傳前在裝置端轉換。
SnapPress 會從你的照片圖庫讀取 HEIC,使用 Apple 在每個 iOS 版本都持續維護和更新的 iOS 影像管線解碼,再透過 REST API 把 JPEG 上傳到你的 WordPress 媒體庫。因為抵達的檔案是標準 JPEG,你再也不會看到「抱歉,基於安全性的考量,不支援這個檔案類型。」——這個網站不會,你連接的任何其他 WordPress 網站也不會。
關於從 iPhone 批次發佈到 WordPress 的工作流程,請參考 從手機批次上傳圖片到 WordPress:完整指南 的比較,以及 5 款最佳 WordPress 照片上傳 App 比較 的整理。
重點回顧
- 這個錯誤代表你的副檔名或 MIME 類型不在
get_allowed_mime_types()回傳的 WordPress 允許清單裡。 - 最乾淨的解法:在自訂外掛加入
upload_mimes過濾器(解法 1)。 - 免寫程式的解法:WP Add Mime Types 或 File Upload Types 外掛(解法 2)。
- 絕不能當永久解法:
wp-config.php的ALLOW_UNFILTERED_UPLOADS(解法 3)。 - iPhone HEIC 工作流程:用 SnapPress 在裝置端轉換,讓檔案在抵達 WordPress 之前就是 JPEG(解法 4)。
如果你經常把 iPhone 照片發佈到 WordPress,裝置端轉換的路徑可以把這一整類錯誤連根拔除。免費開始使用 SnapPress,透過 SnapPress Connect WordPress 外掛連接網站,下次在分享頁面選取照片時,它們就會以 JPEG 上傳——不需要過濾器、不需要外掛、伺服器的 wp-config.php 一個字都不用改。
常見問題
WordPress 為什麼會封鎖某些檔案類型?
WordPress 透過 wp_check_filetype_and_ext() 函式驗證每一次上傳,並與 get_allowed_mime_types() 回傳的固定允許清單比對。「基於安全性的考量」這句訊息的意思是,你的副檔名或 MIME 類型不在那份清單裡。它原本的目的是防止攻擊者上傳偽裝成圖片的可執行 PHP 檔案,但同一個過濾機制也擋下了 HEIC、AVIF、SVG 這些正當格式——只因為你那個版本的 WordPress 發布時,這些格式還沒被加進核心清單。解決方法是透過過濾器加入 MIME 類型,或在上傳前把檔案轉換成允許的格式。
允許自訂檔案類型安全嗎?
大致上安全,但要有所取捨。圖片格式(HEIC、AVIF、WebP)和媒體容器(MP4、MOV)加進 upload_mimes 過濾器是安全的——它們無法被當作程式碼執行。唯一需要小心的圖片格式是 SVG,因為它是 XML,可以內嵌 JavaScript;如果你要允許 SVG,請同時安裝 Safe SVG 這類淨化外掛。絕對不要把 ALLOW_UNFILTERED_UPLOADS 寫進 wp-config.php 當作永久解法。那個常數會關閉 WordPress 所有的上傳安全檢查,包括擋下 PHP 直接上傳的那些。
PHP 過濾器和外掛哪個比較好?
如果只是你自己掌控的一兩個 MIME 類型,把 upload_mimes 過濾器放在子佈景主題的 functions.php 或一個小型自訂外掛裡最乾淨——五行程式碼、沒有外掛負擔,走外掛路線還能在佈景主題更新後存活。如果要處理五種以上的檔案類型,或者你不編輯 PHP,那麼 WP Add Mime Types 或 File Upload Types 這類外掛才是正解。兩者效能完全相同,因為底層跑的是同一個 WordPress 過濾器。請依照你是否習慣改程式碼來選,而不是速度。
如何允許 iPhone 的 HEIC 檔案?
在 functions.php 或自訂外掛加入這段程式碼:add_filter('upload_mimes', function($m) { $m['heic'] = 'image/heic'; $m['heif'] = 'image/heif'; return $m; });。WordPress 6.7 已把 HEIC 加進核心允許清單,所以在全新的 6.7+ 安裝上這個過濾器可能已經不需要——但許多共享主機提供的是客製化 WordPress 版本,仍會移除較新的 MIME 類型。iPhone 照片的聰明做法是用 SnapPress 這類工具在裝置端轉成 JPEG,讓抵達伺服器的檔案是任何 WordPress 安裝都從未拒絕過的標準 JPEG。
如何安全地允許 SVG 檔案?
不要只是把 image/svg+xml 加進 upload_mimes 過濾器就了事。SVG 是 XML,可以內嵌 JavaScript 或外部參照,並在管理員的瀏覽器中執行。請安裝 Safe SVG(免費外掛),它會把 SVG MIME 類型加進允許清單,同時透過 svg-sanitizer 函式庫淨化傳入的檔案,移除 script 標籤、事件處理器和外部實體參照。如果只有信任的設計師需要上傳 SVG,也可以把過濾器和 current_user_can('manage_options') 檢查結合,把 SVG 限制給管理員。
如果編輯 functions.php 弄壞了網站該怎麼辦?
首先,不要慌。白畫面幾乎都是你加入的程式碼片段少了分號或括號沒對上。透過 SFTP 或主機商的檔案管理員連線,編輯 wp-content/themes/你的佈景主題/functions.php,移除有問題的片段並儲存,網站就會恢復。如果無法編輯檔案,每家主機商的控制台都有「一鍵查看 PHP 錯誤記錄」或「重設佈景主題」的選項。今後請透過子佈景主題編輯 functions.php,或者——更好的做法——把自訂過濾器放進一個小型自訂外掛,這樣程式碼出錯只會停用一個外掛,而不是弄垮整個網站。