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 はクライアントの問題ですか、それともサーバーの問題ですか?
形式上はクライアントエラーですが、多くの場合サーバー側の設定ミス — メソッドが欠けているルートや、動詞をブロックしているプロキシ — を露呈します。