Tomoya's Blog (ja)

Just a blog, nothing fancy

WordPressをnginxリバースプロキシ下で動かしたら、/wp-json/以下へのアクセスが404になって困った話

環境

サーバーは次のような環境。

  • FreeBSD 11.0-RELEASE-p3
  • nginx/1.10.2
  • PHP 7.0.13 (fpm-fcgi)
  • WordPress 4.6.1
    なお、nginxはphp-fpmにリクエストを投げるものと、そのnginxに対してリバースプロキシの働きをするものと2つ動いている。(余談だが、この2つのnginxはそれぞれ別Jailで動かしている)

問題

Markdown記法目当てでJetpackをインストールし、その機能を有効化するときのことだった。JSONがどうこうというエラーを吐かれて機能の有効化がコケるのでサーバーログを見ると、/wp-json/*へのアクセスがことごとく404になっていた。Wordpressのルートディレクトリを見ても、そもそもwp-jsonなんてディレクトリがない。

調べていると、WordpressのJSON APIの機能を使うにはPretty Permalinkが正しく動いていないとダメだということが分かった。確かにWordpress側の設定では有効化されているのになぜか正しく動かない。さらに調べると、問題はnginxの設定にあることが分かった。

解決法


location / {
    ...
    index index.php index.html;
    try_files $uri $uri/ /index.php?$args; //この行を追加。
    ...
}

nginxは/wp-json/*へのリクエストに対応するためにまずドキュメントルート (今はWordpressのインストール先) を探すのだが、特に何も指定しないとドキュメントルート内に/wp-json/が存在しないのでそのまま諦めて404を返してしまう。だが本来は、/wp-json/*へのリクエストはWordpressのindex.phpに渡して、PHPでレスポンスを生成して返すべきである。追加した行は指定された場所にファイルが存在しなければindex.phpにそのパスを引数として渡すよう内部でリダイレクトがかかるように指定するものである。こうするとうまく動くみたい。

なお、単純にPretty Permalinkを使うときにも必要なのだが、変更を加えなくても動いていたのが不思議である。実は記事のパスが/index.php/2016/11/...になっていたとかだろうか…

参考文献

WordPress permalinks