ロリポップのWordPressで、REST API+アプリケーションパスワードを使おうとしたら、ユーザー名もパスワードも正しいのに 401 rest_not_logged_in(や rest_cannot_create)が返って投稿できない——。同じ壁にぶつかった人へ、原因と、実際に解決できた手順をまとめます。SSHが使えないロリポップでも動きました。
症状:正しい認証情報なのに 401 rest_not_logged_in
やっかいなのは、カテゴリ一覧の取得(GET)は成功するのに、投稿作成や users/me だけ401になること。これは「カテゴリ取得は誰でも見られる公開エンドポイントだから通っているだけ」で、実は認証がまったく効いていないのが正体です。ここに気づかないと延々ハマります。
原因は2つあった
①基本パーマリンクだと /wp-json/ が404
パーマリンクが「基本(?p=番号)」設定だと、/wp-json/ のきれいなURLが存在しません。REST APIには ?rest_route=/wp/v2/... 形式でアクセスする必要があります。
②ロリポップが Authorization ヘッダーをPHPに渡さない(本丸)
最大の原因がこれ。Authorization ヘッダーがサーバー側で落とされ、WordPressまで届きません。その結果、アプリケーションパスワードが読まれず「未ログイン」扱いになります。.htaccess に SetEnvIf や RewriteRule でヘッダーを渡す定番ワザも試しましたが、この環境では効きませんでした。
解決法:独自ヘッダー「X-Authorization」+ mu-plugin で復元
ポイントは、標準の Authorization は落とされても、独自ヘッダー(X-Authorization)はPHPまで届くこと。これを使い、サーバー側で本来の Authorization に戻します。
手順1:送信側は X-Authorization にも認証情報を載せる
REST APIへリクエストする際、Authorization: Basic ... と同じ値を X-Authorization ヘッダーにも付けて送ります。
手順2:mu-plugin で Authorization を復元する
wp-content/mu-plugins/auth-shim.php として下記を設置します(mu-pluginsなので有効化操作は不要・置くだけで効きます)。
<?php
// X-Authorization を Authorization に復元する
if (empty($_SERVER['HTTP_AUTHORIZATION']) && !empty($_SERVER['HTTP_X_AUTHORIZATION'])) {
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['HTTP_X_AUTHORIZATION'];
if (stripos($_SERVER['HTTP_AUTHORIZATION'], 'Basic ') === 0) {
$d = base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6), true);
if ($d !== false && strpos($d, ':') !== false) {
list($u, $p) = explode(':', $d, 2);
$_SERVER['PHP_AUTH_USER'] = $u;
$_SERVER['PHP_AUTH_PW'] = $p;
}
}
}
mu-pluginsフォルダが無ければ wp-content/ の中に作成し、その直下にファイルを置くのがポイントです(サブフォルダ内では読み込まれません)。
手順3:REST APIは ?rest_route= 形式で叩く
例:https://example.com/?rest_route=/wp/v2/users/me のように、?rest_route= を付けてアクセスします。
確認方法
users/me を叩いて自分のユーザー情報(IDや権限)が返ってくれば成功です。401のままなら、mu-pluginの設置場所と、X-Authorization が実際にPHPまで届いているか(届くヘッダー名を一覧表示する簡単な診断PHPを置くと早い)を確認しましょう。
補足:HTTPS判定も前提条件
アプリケーションパスワード認証は is_ssl() が true であることが前提です。ロリポップの無料独自SSLを使っていれば、通常はHTTPS判定でOKでした。
まとめ
ロリポップでの rest_not_logged_in は、「Authorizationヘッダーがサーバーに落とされる」のが主因。X-Authorization + mu-plugin で復元すれば、SSHなしでもREST API投稿が動きます。ロリポップ関連のつまずきはデータベース接続確立エラーの解消法やマルチドメインでのサイト作成もどうぞ。なお、この認証突破を含む“ブログ自動化”の全体像を非エンジニア目線でまとめた体験談が自分でコードを書けない私が、Claude Codeでブログ運営を自動化してみたです。あわせてどうぞ。


コメント