解説
URLは合っているのに405?HTTPメソッドとAllowヘッダーを確認する手順
ブラウザでは開けるURLへ、プログラムから送ると405が返る。URLの文字だけでなく、GETやPOSTといったHTTPメソッドも確認してみよう。

ブラウザでは開けるURLへ、プログラムから送ると405が返る。URLの文字だけでなく、GETやPOSTといったHTTPメソッドも確認してみよう。
この記事は405 Method Not AllowedとAllowヘッダーの読み方を整理する。公開サイトへ書き込みを試す練習はしない。編集部の確認は、ローカルの読み取り専用サンプルに限定しているよ。
メソッドは、何をしたいかを表す
HTTPの要求では、接続先のURLとともにメソッドを送る。GETは対象の表現を取得するため、POSTは内容を送って処理してもらうためなど、メソッドごとに意味がある。
同じURLでも、どの操作を受け付けるかはサーバーの実装や設定で決まる。存在するURLならどのメソッドでも使える、というわけではないよ。
405とAllowを一緒に読む
405は、メソッド自体はサーバーに認識されているが、その対象では許可されていないことを示す。405を返すときは、サーバーがAllowへ対応するメソッドを示す必要がある。
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
この例はGETとHEADが許可された対象。POSTを何度も繰り返しても、同じ条件のままなら解決につながりにくい。最初に要求行と応答のヘッダーを記録しよう。
ローカルで比べた結果
編集部では、GETとHEADに対応し、POSTへ405を返す練習サーバーで確認した。サンプルはファイルやデータを更新しない。
| 要求 | 練習サーバーの結果 |
|---|---|
| GET /practice | 200と練習用の本文 |
| HEAD /practice | 200、本文なし |
| POST /practice | 405、AllowはGETとHEAD |
これは、この確認用実装の結果。Pythonなどの標準サーバーが、未実装の操作に必ず405を返すという意味ではないよ。実際のサービスは公式API仕様と応答を照合する。
403・404・501とは同じではない
403はアクセスが拒否された応答、404は対象が見つからない応答として使われる。501は要求された機能をサーバーが実装していない場合などに使われ、特定のURLで操作を許可していない405と分ける。
実装が情報を隠すために別の応答を返す場合もあるので、番号だけで内部構成を断定しない。Allowに操作があっても、その操作が認証なしで成功する保証ではないよ。
直す前に、経路と仕様を確認する
- URL、メソッド、応答番号、Allowを記録する。
- API資料のパスとメソッドが一致しているか見る。
- 直前にリダイレクトがないか確認する。
- プロキシ、Webサーバー、アプリのどこで拒否されたかを調べる。
- 書き込みが必要な操作は、許可されたテスト環境と架空データで確認する。
なお、AllowとCORSのAccess-Control-Allow-Methodsは同じヘッダーではない。ブラウザのオリジン間アクセス制御と、そのURLが実装する操作の確認を混ぜないようにしよう。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。