シンレンタルサーバーのWordPress REST APIで「401権限エラー」が出た時の対処法

IT・WEB

外部サーバー(VPSなど)からWordPress REST APIを使って自動投稿しようとした際、ユーザー名もアプリケーションパスワードも合っているのに、なぜか 「401 Unauthorized(このユーザーとして投稿を編集する権限がありません)」 と表示されて失敗することがあります。

これはシンレンタルサーバー(やエックスサーバー)の仕様で、セキュリティ上の理由から HTTP認証ヘッダー(Authorization)がPHPに渡されない 設定になっているためです。

この記事では、REST APIを正常に動作させるための .htaccess 編集方法を備忘録として残します。


認証情報は正しいのに「401」で失敗する

PHPなどでcURLを使って投稿しようとすると、以下のようなエラーレスポンスが返ってきます。

{
  "code": "rest_cannot_create",
  "message": "このユーザーとして投稿を編集する権限がありません。",
  "data": { "status": 401 }
}

これは、サーバーが「誰がアクセスしてきたか(認証情報)」を途中で捨ててしまっているのが原因です。


解決策:.htaccess に追記する

WordPressがインストールされているディレクトリにある .htaccess ファイルの先頭付近に、以下の3行を追記します。これにより、捨てられていた認証情報がPHP側へ引き渡されるようになります。

追記するコード

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

実際の .htaccess 構成例

シンレンタルサーバーの標準的な .htaccess に組み込むと、以下のようになります。

# 既存の設定(キャッシュ関連など)
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_StaticMode
RewriteEngine on

# --- ここから追記:REST API 認証を有効化 ---
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
# --- ここまで追記 ---

# 既存の常時SSL化設定など
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

注意点:セキュリティプラグインの干渉

もし .htaccess を修正してもエラーが消えない場合は、以下の点も確認が必要です。

  1. セキュリティ系プラグイン: SiteGuard WP PluginAll In One WP Security などが導入されている場合、REST API自体を無効化している可能性があります。

  2. IP制限: .htaccess やサーバーパネルの設定で、特定のIP以外からのアクセスを拒否していないか確認してください。

修正はサーバーパネルから出来る

直接ファイルを編集してFTPで入れ込むことも出来ますが、シンレンタルサーバーでは「.htaccess」ファイルの編集は、管理画面(サーバーパネル)から編集することができます。

投稿後の確認用スクリプト(PHP)

疎通確認に利用した簡易的なPHPコードも載せておきます。

<?php $site_url = "https://your-site.space"; $username = "your_user"; $app_password = "xxxx xxxx xxxx xxxx xxxx xxxx"; // スペースは除去して送る $auth_string = base64_encode($username . ':' . str_replace(' ', '', $app_password)); $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $site_url . '/wp-json/wp/v2/posts',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode([
        'title'   => 'テスト投稿',
        'content' => '疎通確認成功',
        'status'  => 'publish'
    ]),
    CURLOPT_HTTPHEADER    => [
        'Authorization: Basic ' . $auth_string,
        'Content-Type: application/json'
    ],
]);

$response = curl_exec($ch);
echo $response;
curl_close($ch);

シンレンタルサーバーでREST APIを活用する場合、.htaccessでのヘッダー転送設定は必須です。一度設定してしまえば、VPSからの自動投稿や外部アプリとの連携がスムーズに行えるようになります。

コメント

タイトルとURLをコピーしました