Nginxで静的ファイルをPOSTで取れない

htmlファイルやtxtファイルといったAPサーバーに送らず、Nginxが自ら処理するアクセスをPOSTで取ろうとすると405エラーを返すという挙動になっているようです。

通常のブラウザアクセスではほぼ起こり得ないパターンですが、ネイティブアプリ向けAPIを作っていてクライアント側が全部のアクセスをPOSTで送ってきたりなんかするときはあるかもしれません(実際、僕が遭遇したパターンはこれです)。

解決法としては2つあります。

  1. 設定ファイルで何とかする
  2. ソースコードを変更する

(1.)は、つまり405で来たものを無理やり元のuriにして戻すという手法ですね。
以下の一行をserverディレクティブの中に入れてやるだけでOKです。

error_page 405 = $uri;

ただ、個人的に(1.)の方法はどうなんかなーと思ったので(2.)のように元から断つことにしました。
問題の箇所はsrc/http/modules/ngx_http_static_module.cの207行目あたり*1にある以下のようなコードです。

    if (r->method & NGX_HTTP_POST) {
        return NGX_HTTP_NOT_ALLOWED;
    }

こいつをコメントアウトしてmake && make installすればOKです。
バージョンアップするときに忘れるといけないので備忘録として。

*1:バージョンによって違うかも