wp-comments-post.php への投稿が 405 Method Not Allowed になる問題
確認環境
- Wordpress 4.9.1 https://ja.wordpress.org/
- iThemes Security 6.7.0 https://ja.wordpress.org/plugins/better-wp-security/
- nginx 1.12.1 https://nginx.org/en/
問題
wordpress の記事のコメント投稿が 405 Method Not Allowed になる
確認される現象
記事詳細ページのコメント欄へコメントできない
原因
条件1 : nginx の設定
nginx の location ディレクティブで .php を指定して fastcgi に引き渡している。
https://codex.wordpress.org/Nginx#General_WordPress_rules
upstream php { server unix:/tmp/php-cgi.socket; server 127.0.0.1:9000; } ... server { ... location ~ \.php$ { ... fastcgi_pass php; ... }
条件2: iThemes Security の「コメントスパム」設定が有効
iThemes Security で該当項目を有効にしていると 生成される nginx.conf で以下のような 設定が出力される。
# コメントスパムを削減 - セキュリティ > 設定 > WordPress の微調整 > コメントスパム location = /wp-comments-post.php { limit_except POST { deny all; } if ($http_user_agent ~ "^$") { return 403; } valid_referers server_names jetpack.wordpress.com/jetpack-comment/; if ($invalid_referer) { return 403; } }
上記より
nginx の location ディレクティブは最長一致の設定が用いられる[1]。 そのため条件1で設定した .php の location よりも 条件2の /wp-comments-post.php が優先されるはず。そして 条件2の設定では fastcgi_pass がないためそのまま静的ファイルとして処理される。 nginx は静的ファイルの場合は POST は許可されないため 405 になる[2]。
解決方法
- コメントスパム を off にする(暫定対応)
このままだとコメントスパム対応部分が弱いとも考えられるので コメントスパム部分は別のプラグインに任せるか、上記設定を参考にして自分で fastcgi_pass をする設定を追加するなどすればよい気もする。
(余談) iThemes Security が出力する設定を変更することはできないため、対象 location ディレクティブに fastcgi_pass を設定できない。 そして自分は location ディレクティブに fastcgi_pass を記載することなく設定する方法がわからない、というのと wordpress を運用しようとしている人の nginx 力はそんなに高くないと思っているため 技巧を凝らした nginx 設定するのはあんまりよくない気もする。ので「コメントスパムを off にする」ぐらいしか思いつかない。