WordPress 404 攻擊 – 如果網站平常經常刪除舊文章,可能會出現一個容易被忽略的問題,那就是 404 攻擊。原本可以直接由快取回應的文章,因為快取失效或找不到對應內容,最後重新交由 index.php 處理。當這種情況大量發生時,PHP、PHP-FPM、資料庫甚至整台伺服器的 CPU 使用率都可能長時間維持在較高狀況。
一、WordPress 404 攻擊是怎麼產生的?
一般訪客開啟 WordPress 文章時,理想的流程是:
訪客 → Web Server → 快取 → 直接回傳頁面
如果快取中已經存在完整的 HTML,Web Server 可以直接把內容送給訪客,不需要再次啟動 WordPress。
這種情況下 CPU 使用量通常非常低。
但是當快取找不到對應文章時,流程就可能變成:
訪客 → Web Server → 找不到快取 → index.php → WordPress → 資料庫 → 查詢文章 → 產生頁面 → 回傳
這時候就不再只是單純傳送一個已經產生好的 HTML,而是需要重新執行 WordPress。
二、為什麼刪除舊文章可能讓問題更加明顯?
假設網站原本有 40,000 篇文章。
隨著時間過去,網站可能會刪除其中一部分舊文章,例如:
- 刪除過期內容
- 刪除失效下載
- 刪除重複文章
- 整理分類與標籤
- 大量清理歷史文章
文章刪除本身不一定會直接造成 CPU 長時間升高。
真正需要注意的是:
刪除文章之後,如果沒有妥善處理,就可能形成大量「快取未命中」的請求。也就是 404 回應。
三、快取找不到文章時,為什麼會跑到 index.php?
WordPress 本身是一個 PHP 動態網站。
當 Web Server 沒有辦法直接提供現成的快取檔案時,請求通常會進入 WordPress 的 PHP 處理流程。
簡化來說:
訪客請求文章
↓
檢查快取
↓
找到快取?
↙ ↘
是 否
↓ ↓
直接回傳 index.php
↓
啟動 WordPress
↓
查詢資料庫
↓
判斷文章狀態
↓
產生網頁內容
↓
回傳給訪客
因此,真正需要注意的不是「index.php 本身很慢」,而是:
為什麼這麼多請求沒有在前面的快取層被直接處理掉?
應該如何改善?
方法一:提高頁面快取命中率
首先應該確認網站的 Page Cache 是否正常,且要能設定 404 快取才有用
也許可以使用:
- Cloudflare ? 。但我用 AI 建議設定未成功。
- 其它快取服務可用 404 快取才有用。
方法二:不要讓所有 404 都進 WordPress
如果 Web Server 可以直接判斷某些不存在的檔案或 URL,就可以避免不必要地進入 WordPress。
理想情況:
請求不存在的資源
↓
Web Server 直接判斷
↓
直接回傳 404
而不是:
請求不存在的資源
↓
index.php
↓
WordPress
↓
資料庫
↓
404
後者會浪費 PHP 與資料庫資源。
我這邊是使用正面表列黑名單處理。在 site 的 config 增加
RewriteMap blocklist "txt:/etc/apache2/block.list.txt"
#block.list.txt 黑名單表列 第一行為文章 ID 。第二行都是 1
94985 1
95290 1
95727 1
95969 1
96427 1
96509 1
設定黑名單後 CPU 可明顯下降
GA4 圖示
高點當時全都一堆機器人。且一堆 404 。造成長時間 CPU 100%











