xml-rpcを使ってwordpressにリモート投稿や更新をしようとしたが失敗するときは.htaccessファイルのhttpsへの転送設定が原因かも

Wordpress

以前から定期的にlinuxのphp(IXR_Library(IXR_Client))を使ってWordpressのxmlrpc.phpに対して記事の更新命令を送って自動更新していましたが、ある日からエラーが出て更新できなくなりました。

エラーメッセージは、

-32300 : transport error – HTTP status code was not 200]

です。

で色々調べましたが、結局、.htaccessファイルに記載したhttpsへの転送設定が起因していました。

エラーの原因は.htaccessファイルに記載したhttpsへの転送設定が起因

具体的には、WordpressのSSL化を徹底するために、httpでアクセスが来た際、httpsに301リダイレクトする設定を入れたことが原因でした。

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

これを入れてなければ正常動作し、これを入れるとエラーが出る状況となりました。

リダイレクトするとpostがgetに変わる

細かな挙動の詳細はつぶし切れていませんが、エラーに至る挙動は大筋で以下となります。

1.IXR_Libraryで対象サーバのxmlrpc.phpにアクセスする

2..htaccessファイルのリダイレクト設定で301リダイレクトされる

3.301リダイレクトの際、methodがpostからgetに変わる(←ここがみそ)

4.xmlrpc.phpに対しgetでアクセスすると、httpコードが200ではなく405を返す

xmlrpc.phpへgetでアクセスすると200ではなく405を返してエラーになる

いくつかポイントがありますが、まず最初の1の段階でhttpsにアクセスしているのですがなぜか2で301リダイレクトが入っているようです(詳細挙動は確認しきれず)。

次に3ですが、もともとIXR_Libraryでpostでアクセスしていたのが、リダイレクトの際に、getに変わるようです。
参考:
https://havelog.ayumusato.com/develop/others/e172-http-request-trans.html

最後に4ですが、どうもxmlrpc.phpへのアクセスはpostでないといけないらしく、getでアクセスすると405を返してきます。

これがIXR_Libraryを使ったWordppress記事更新がエラーになった原因です。

解決方法についてですが、暫定的には、.htaccessのリダイレクト設定をはずすことも考えられますが、これはこれで目的があるので、別の方法を調査中です。

Wordpress