Webサーバーやサーバサイド上で指定して、ブラウザのアクセス先をコントロールすることができる、便利なHTTPリダイレクトですが、設定を間違えると厄介な状態になることがしばしばあります。
例えば、リダイレクト条件の指定を間違えると、リダイレクトループと呼ばれる、延々とリダイレクトされてしまう状態が発生することがあります。
そんなリダイレクトの注意点の一つとして、実はリダイレクトの方法によってはHTTPメソッドが引き継がれないことをご存知でしょうか。
従来から使われている301/302ステータスコードを使用したリダイレクトでは、実はPOSTのアクセスであってもGETのアクセスであっても、リダイレクト後は強制的にGETメソッドに書き換えられてしまいます。
つまり、例えばメールフォームのPOST先をリダイレクトで変更しようとした場合、ステータスコード301/302を使用してリダイレクトした場合、GETメソッドに変更させられてしまうため、不具合の原因となります。
ではPOSTメソッドを維持したままリダイレクトした場合はどうすればいいのでしょうか。
実は、もともと302リダイレクトはメソッドが維持されたままリダイレクトされることを想定していたようなのですが、どういうわけかGETに直してリダイレクトするように実装するブラウザが多かったため、GETメソッドに変換されるようになってしまったようです。
そんな困った事態に対応するため、新しい規格では307/308リダイレクトが制定されています。
307が302同様に一時的リダイレクト、308が301と同様に恒久的リダイレクトとなっていますが、違いはメソッドを引き継ぐことを仕様として強制している点にあります。
これらのステータスコードを使用してリダイレクトを行うと、新しいブラウザであればPOSTメソッド通信時にリダイレクトされてもPOSTのままリダイレクト先に通信が行われます。
なお、最近JavascriptのAjax通信でよく使われるAxiosはこの307/308でリダイレクトを行うと.catchメソッドに入ってしまい、500番台のコードと同様にエラーとして扱われてしまうため、こういったライブラリを使用する場合は注意が必要になりそうです。
POST通信のままリダイレクトを行わせたい場面が出てきた場合は、是非参考にしてみてください。
参考URL:
リダイレクトとHTTPステータスコードのお話 – hero-rinのブログ
nginxでPOSTメソッドのリダイレクトを行う – Qiita