HTTP 405 Method Not Allowed

アドレスは正しいがメソッドが違う: リソースは存在しますが、この HTTP メソッドを受け付けません。

HTTP 405 の意味

HTTP 405 Method Not Allowed は、サーバーが URL は認識しているものの、その HTTP メソッド — GET、POST、PUT、DELETE — をサポートしていないことを意味します。レスポンスには、サポートされているメソッドを列挙した Allow ヘッダーを含めなければなりません。

これはほとんどの場合、クライアントと API のミスマッチです: フォームがページのルートに POST している、スクリプトが API が PATCH を期待している場所に PUT を送信している、あるいは Webhook が誤ったメソッドで設定されている、といったケースです。

405 エラーのよくある原因

  • GET のみを処理するエンドポイントに POST が送信された(またはその逆)ケースで、API のサンプルをコピー&ペーストした後によく起こります。
  • リダイレクト(301/302)が、リクエストがエンドポイントに到達する前に POST を GET に変換してしまいました。
  • アプリが PUT/DELETE を期待しているのに、Web サーバーがそれらのメソッドをグローバルにブロックしています。
  • 誤ったルート: 本来のエンドポイントは /api/items(POST)ですが、リクエストは /items に到達しています。

開発者としての対処法

  • Allow レスポンスヘッダーを読んでください — その URL が受け付けるメソッドが正確に列挙されています。
  • 正しいメソッドとパスの組み合わせについて API ドキュメントを確認してください。
  • パスの途中にリダイレクトがある場合は、メソッドがホップを越えて維持されるよう 307/308 を使用してください。
  • サーバー側では、フレームワークのルートがそのメソッドを宣言しており、プロキシがそれを取り除いていないことを確認してください。

レスポンス例

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
Content-Type: application/json

{"error":"method_not_allowed"}

よくある質問

ある URL がどのメソッドをサポートしているかはどうすれば確認できますか?

405 レスポンスの Allow ヘッダーを確認するか、その URL に OPTIONS リクエストを送信してください。

なぜ自分の POST が GET に変わってしまったのですか?

間にあった 301 や 302 のリダイレクトが、クライアントにメソッドを切り替えさせました。POST を受け付けるエンドポイントには 307/308 のリダイレクトを使用してください。

405 はクライアントの問題ですか、それともサーバーの問題ですか?

形式上はクライアントエラーですが、多くの場合サーバー側の設定ミス — メソッドが欠けているルートや、動詞をブロックしているプロキシ — を露呈します。