WordPress REST API:為什麼不完全關閉,只擋登出狀態

聯盟行銷揭露 Ver 3.1
聯盟行銷揭露 Ver 3.2(僅限行動版)

WordPress REST API 會透過 wp-json 位址,把網站的使用者名稱也顯示給沒有登入的訪客。完全關閉有時會讓區塊編輯器儲存失敗,所以本文整理只擋登出狀態的請求、並用 401 回應確認的方法。

1️⃣ 什麼是 WordPress REST API:wp-json 位址與它的用途

WordPress REST API 是以 JSON 格式交換文章、頁面、使用者等網站資料的 WordPress 內建功能,在網站網址後面的 /wp-json/ 底下回應。

/wp-json/ 底下的位址依資料種類分成 [wp/v2/posts]·[wp/v2/pages]·[wp/v2/users] 等,每一個位址稱為端點(endpoint)。區塊編輯器儲存文章時,也會向這些位址送出請求。

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ 透過 wp-json 曝光的使用者名稱

  • ↪️ 擋的理由:users 401 · 作者頁面也看得到

[wp/v2/users] 端點會回應每位發表過文章的使用者的顯示名稱與 slug,而 slug 預設就是登入帳號。測試網站 https://testpilotweb.com/ 的管理員帳號,slug 也和登入帳號相同。

登入帳號一旦曝光,攻擊者只要猜出密碼就能登入;測試網站的 WordPress 登入畫面,在 2026 年 10 月 7 日一天就記錄到 2,570 次暴力破解嘗試。

就算擋了這個位址,作者頁面網址(/author/帳號/)裡還是留著同一個帳號。

3️⃣ 完全關閉會壞掉的東西

  • ↪️ 區塊編輯器儲存 · MCP 工具 0 個

把 WP REST API 全部關掉,最先壞掉的就是區塊編輯器的文章儲存;所以 WordPress 最佳化外掛之一的 Perfmatters,也把關閉範圍分成 [Disable for Non-Admins] 與 [Disable When Logged Out] 兩個等級。有作者或投稿者帳號的網站,[Disable for Non-Admins] 也會讓這些帳號無法儲存文章。

就算是只擋登出狀態的網站,在 claude.ai 連接 MCP 連接器、完成驗證後,工具仍顯示 0 個。伺服器紀錄上的 MCP 請求全是 401,原因是 Perfmatters 在 MCP 確認權杖之前就擋下了請求。

[Disable REST API] 的值登出訪客的 users 位址非管理員帳號的文章儲存適合
Default (Enabled)使用者名稱曝光可以儲存—
Disable for Non-Admins401儲存失敗沒有作者·投稿者帳號的網站
Disable When Logged Out401可以儲存有作者帳號的網站;MCP 等權杖連線要加入例外路徑

4️⃣ 只擋登出狀態的設定(Perfmatters)

  • ↪️ 設定位置 · 確認 401 回應

在 WordPress 管理後台的 [設定] → [Perfmatters] → [General],把 [Core] 項目的 [Disable REST API] 改成 [Disable When Logged Out],再按 [儲存設定]。

WordPress Settings → Perfmatters → General(WordPress REST API)
Perfmatters Disable REST API: Disable When Logged Out

Perfmatters 支援的語言:英文(預設)、韓文、德文、法文、義大利文、荷蘭文、葡萄牙文(巴西)、俄文、烏克蘭文、土耳其文、保加利亞文、匈牙利文、印尼文、波斯文、中文(簡體)

Perfmatters settings simulator: General → Core
Perfmatters 設定模擬器 · Perfmatters 評測·指南

在沒有登入的無痕視窗開啟 /wp-json/wp/v2/users,會收到 401 回應與 [Sorry, you do not have permission to make REST API requests.] 訊息,而登入狀態下的區塊編輯器仍然照常儲存文章。

🔌 同樣的請求,兩種回應 GET /wp-json/wp/v2/users
沒有擋的網站
200
沒有登入的訪客也看得到使用者名稱。
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
設為 [Disable When Logged Out] 的網站
401
沒有登入的請求會收到附訊息的 401 回應。
{⏎  "code": "rest_authentication_error",⏎  "message": "Sorry, you do not have permission to make REST API requests.",⏎  "data": { "status": 401 }⏎}
slug slug 預設就是登入帳號。
左邊只取回應中的 id·name·slug·link 四個項目,名稱是範例(user_a)。


5️⃣ 為擋下的路徑設定例外

  • ↪️ MCP 路徑例外 · 與移除 REST API 連結的差別

在擋住的狀態下只想開放特定路徑時,把該路徑加入 Perfmatters 的 [perfmatters_rest_api_exceptions] 過濾器。claude.ai MCP 連接器工具 0 個的問題,是在 Perfmatters 的 [Code] 選單建立 PHP 程式片段,只把 MCP 路徑設為例外來解決的。

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

設了例外之後,沒有權杖的請求仍會由 MCP 自己以 [MCP authentication required.] 訊息與 401 回應擋下,/wp-json/wp/v2/users 則繼續回傳 Perfmatters 的 401 回應。

🚦 請求經過的順序
設例外之前 · MCP 請求
在 [Disable When Logged Out] 狀態下,claude.ai MCP 連接器完成驗證後送出的請求。
Perfmatters
401 擋下
→↓
MCP 權杖確認
到不了
→↓
結果
工具 0 個
設例外之後 · MCP 請求
/mcp/mcp-oauth-server 已把路徑加入 Perfmatters 例外的狀態。
Perfmatters
因為是例外路徑而通過
→↓
MCP 權杖確認
由 MCP 自己確認
→↓
結果
沒有權杖就是 401
[MCP authentication required.]
設例外之後 · /wp-json/wp/v2/users
沒有放進例外的路徑照樣擋下。
Perfmatters
401 擋下
→↓
結果
維持擋住使用者名稱曝光
⚠️ Perfmatters 會在 MCP 確認權杖之前擋下請求。

同一個 [Core] 項目的 [Remove REST API Links],只是從頁面標頭與回應標頭刪除 api.w.org 連結的設定,WP REST API 本身照樣回應。

🔢 FAQ & 推薦內容

xmlrpc.php 和 REST API 是不同的位址,所以擋了 REST API 它還是會回應。測試網站在 2026 年 10 月 8 日一天就記錄到 734 次對 xmlrpc.php 的 POST 請求,Perfmatters 可以用同一個 [Core] 項目的 [Disable XML-RPC] 擋下。

WP Rocket 把 /wp-json/ 位址放在快取排除清單裡,所以 REST API 的回應在儲存當下就會改變。[Remove REST API Links] 這類會改變頁面 HTML 的設定,要清除快取後才會生效。

不是。WordPress 區塊編輯器儲存文章時會向 REST API 送出請求,連接 claude.ai 這類 AI 工具的 MCP 連接器也使用 /wp-json/ 底下的路徑。

ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 8   +   5   =