何が起きたのか?
405 は「URL は確かに合っているけれど、その入り方は許していません」というサインです。 教室で言えば、正しい教室の前まで来たのに、見学用の出入口から授業に乱入してしまった——そんな状況です。サーバーは「場所」は認識しています。問題は「やり方」のほうです。
レスポンスには Allow ヘッダが付いていることが多く、そこに「ここでは GET と HEAD だけ受け付けます」のように、許可されているメソッドが書かれています。まずはそのヘッダを読むのが近道です。
黒板からのひとこと
校舎の入口にはいくつもの扉があり、それぞれ「生徒昇降口」「業者用搬入口」「来賓玄関」と役割が決まっています。同じ建物に着いても、用件によって入る扉は違います。間違えれば、警備員に「こっちじゃないですよ」と止められる。
405 もそれと同じです。URL という建物には着いている。でも GET 用の入口に POST で入ろうとしている。サーバーは扉を指差して「使うならこの方法ですよ」と教えてくれているだけです。
解決への歩み
大丈夫、次はこうしてみよう:
- 使っているメソッドを確認:fetch の
methodや form のmethod属性が意図したものになっているか - レスポンスの Allow ヘッダを読む:そのエンドポイントが受け付けるメソッドが列挙されている
- API ドキュメントと突き合わせる:仕様変更で PUT が PATCH に変わったケースもよくある
- ルーティング設定を確認(管理者向け):フレームワークのルート定義、リバースプロキシのメソッド制限を順に
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 405 Method Not Allowed
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>405 Method Not Allowed</h1></body></html>