HTTP 405 Method Not Allowed:意味と直し方
ホーム
HTTP 405 Method Not Allowed
HTTP 405 Method Not Allowed:原因、Allowヘッダー、対処法 | We.Inc
サーバーが405を返す理由、送らなければならないAllowヘッダー、そしてFlask、Express、Next.jsでの直し方を解説します。自分のルートに合った正しい405レスポンスを組み立てられます。
405 Method Not Allowedは、URLは存在するものの、使ったHTTPメソッドを受け付けないという意味です。たとえば、GETしか処理しないルートにPOSTを送った場合です。サーバーは、受け付けるメソッドをAllowヘッダーで列挙しなければなりません。そのどれかを送るか、サーバー側にそのメソッドのハンドラーを追加しましょう。
405と近いステータスの比較
405 Method Not Allowed リソースは存在するが、このメソッドは受け付けない Allowにあるメソッドを使うか、ハンドラーを追加する
404 Not Found このURLにリソースがない パスを修正する
501 Not Implemented サーバーがそのメソッド自体に対応していない 標準のメソッドを使う
403 Forbidden メソッドは正しいが、権限がない アクセス権を得るか、アカウントを切り替える
ルートが処理するメソッドにチェックを入れ、クライアントが送るメソッドを選ぶと、サーバーが返すべき正確なレスポンスがビルダーに表示されます。通常の成功か、チェックを入れた順にメソッドを並べたAllowヘッダー付きの405です。
ルートが実際に処理する各メソッドにチェックを入れます。 失敗しているリクエストが使うメソッドを選びます。ブラウザーのネットワークパネルで確認できます。 レスポンスを読みます。405には、チェックを入れたすべてのメソッドを含むAllowが必要です。 下にある、自分のフレームワークに合った修正方法をコピーします。
まず、失敗したレスポンスのAllowヘッダーを確認しましょう。サーバーが受け付けるメソッドがわかり、フォームが間違ったメソッドを使っていることが判明する場合がよくあります。 method属性のないフォームはGETで送信されます。ハンドラーがPOSTしか受け付けないなら、フォームに method="post" を追加しましょう。 末尾のスラッシュやリダイレクトによって、途中でPOSTがGETに変わり、POST専用のルートに届いてしまうことがあります。ネットワークパネルで、すべての経由先を確認しましょう。 サーバーを書くときは、既知のパスに間違ったメソッドが来たら、404ではなくAllow付きの405を返しましょう。そうすれば、クライアントやAPIツールがミスの内容を説明できます。
よくある質問
405はクライアントの問題ですか、サーバーの問題ですか?
4xx系のコードなので、サーバーが問題にしているのはリクエストです。クライアントが別のメソッドを使うか、サーバーの管理者が送られてくるメソッドへの対応を追加するかのどちらかです。
405レスポンスにはAllowヘッダーが必須ですか?
必須です。RFC 9110では、サーバーはリソースが現在サポートしているメソッドを列挙したAllowヘッダーフィールドを生成しなければならないと定めています。リソースがどのメソッドも受け付けない場合は、空のリストでも構いません。
フォームを送信すると405になるのはなぜですか?
たいていは、ルートが受け付けないメソッドをフォームが送っています。たとえばFlaskのルートは、ルートのデコレーターに methods=["GET", "POST"] を渡すまではGETにしか応答しません。
Expressが405ではなく404を返すのはなぜですか?
Expressは、メソッドが一致しない場合もパスが一致しない場合も同じように扱います。どのルートも応答しなかったので、リクエストは404のハンドラーに流れます。そのパスに対してapp.allで受け止める処理を追加し、自分で405を返しましょう。
405と501の違いは何ですか?
405は、このリソースが、サーバーの理解しているメソッドを拒否していることを意味します。501は、サーバーがどのリソースに対してもそのメソッドをサポートしていないことを意味します。
仕様に書かれたルール
メソッドはオリジンサーバーに認識されているものの、対象のリソースがそれをサポートしていない状態です。サーバーはどのメソッドなら動くかを知っているので、仕様ではAllowでそれを伝えるよう求めています。Allowのない405は不完全です。
405がよく発生する場所
よくある発生源は、1つのメソッドだけで登録されたフレームワークのルート、メソッドごとに別々に対応付けるAPIゲートウェイ、そしてファイルを配信するだけで書き込みを受け付けない静的ファイルサーバーです。どの場合も、パスは一致したのにメソッドが一致しなかったということです。 Next.jsのルートハンドラーは、メソッドごとに1つの関数をエクスポートします。対応している名前はGET、POST、PUT、PATCH、DELETE、HEAD、OPTIONSで、OPTIONSをエクスポートしなかった場合は、エクスポートしたメソッドから組み立てたAllowヘッダーでNext.jsが代わりに応答します。
スタック別の修正方法
Flask:ルートが受け付けるメソッドをすべて宣言する
methods= がないと、ルートはGETにしか応答しません(HEADとOPTIONSはFlaskが自動で追加します)。
Express:404に流さず、本物の405を返す
本来のハンドラーの後に置いたapp.allが、同じパスへのそれ以外のメソッドをすべて受け止めます。
Next.jsのルートハンドラー:呼び出すメソッドをエクスポートする
app/api/items/route.ts。エクスポートしていないメソッドのリクエストは、あなたのコードに届きません。
HTML:サーバーが期待するメソッドをフォームに指定する
method属性のないフォームはGETで送信されます。
405レスポンスビルダー
このルートが処理するメソッド
クライアントが送るメソッド
サーバーが返すべき内容
このメソッドはサポートされているので、405は関係ありません。
このメソッドは一覧にないため、チェックを入れた{n}個のメソッドを示すAllowヘッダー付きの405が返ります。
無料で始める · クレジットカード不要
関連: ガイド|Webマーケティングと集客を学ぶ
製品
ご利用いただける方
機能
リソース
会社情報
サイトマップを見る