あまり疑問視はしなかったが...
何かしら入力操作をするサイトの構築にて「JavaScriptからPOSTリクエスト→サーバー側で受理→別の画面へ遷移」というPRGパターンは血反吐を吐くほど見てはきたが、POSTの通信がリダイレクトなんだっけと思慮することがあったので調べてみた。
結論は、POSTリクエスト自体はリダイレクトではない。
だが、サーバー側がリダイレクトを指示したときはリダイレクトとなる。
どういうことだ?
ASP.NET MVCでは、画面遷移の方法として主に以下の2つがある。
- View():現在のコントローラー内のビューを表示(フォワード)
- RedirectToAction():別のアクションへリダイレクト(GETで遷移)
public IActionResult Index()
{
return View(); // フォワード
}
public IActionResult GoToNext()
{
return RedirectToAction("NextPage"); // リダイレクト(GET)
}
サーバーサイドでリダイレクトしたときは、301または302のHTTPステータスコードが返却されるが、一方でデータ通信の結果を返却するような処理では200のHTTPステータスコードが返却される。
🔄 リダイレクト vs View の違い(ASP.NET MVC)
項目 | リダイレクト (RedirectToAction ) |
View (View ) |
---|---|---|
HTTPメソッド | 通常は GET に変換される(POST → GET) | 元のメソッド(POSTなど)を保持 |
URL変更 | クライアント側でURLが変更される | URLは変更されない(内部処理) |
サーバー処理 | クライアントに新しいリクエストを促す | サーバー内でビューを直接返す |
POSTデータの保持 | 基本的に失われる(TempDataなどで補完) | モデルをそのまま渡せる |
用途 | 完了画面への遷移、認証後の誘導など | 入力エラー時の再表示、同一画面内処理など |
SEOへの影響 | 301/302などのステータスが検索エンジンに影響 | SEOには直接関係しない |
ユーザー体験 | URLが変わるため、画面遷移感がある | URLが変わらないため、同一画面に見える |
C#での記述例 | return RedirectToAction("Next"); |
return View("NextView", model); |
📝 補足
- リダイレクトは「一度レスポンスを返して、クライアントが新たにリクエストする」動き。
- **View()**は「サーバー内で処理を完結させて、ビューを直接返す」動き。
- 入力フォームのバリデーションエラー時などは、View()で再表示するのが一般的。
- 完了画面や別機能への遷移は、RedirectToAction()が適している。
こういうミスは割とある。
JavaScript側でPOST処理をした後、HTTPステータスコードを200以外をエラーとする。
実はサーバーサイドでリダイレクトして、301が返却されてました。
あると思います!!