リダイレクトする時、
ステータスコードを気にしたことはあまりなくて、
とりあえず301にしていた。
ら、ハマったので調べた。
結論から書くと、
ログイン失敗などでリダイレクトする時は303にした。
http パッケージを確認
ステータスコードを直接数字で書いてもいいけど、
定義されているのが用意されているなら使った方がいいと思う。
30x系を確認
const (
...略
StatusMultipleChoices = 300 // RFC 7231, 6.4.1
StatusMovedPermanently = 301 // RFC 7231, 6.4.2
StatusFound = 302 // RFC 7231, 6.4.3
StatusSeeOther = 303 // RFC 7231, 6.4.4
StatusNotModified = 304 // RFC 7232, 4.1
StatusUseProxy = 305 // RFC 7231, 6.4.5
StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7
StatusPermanentRedirect = 308 // RFC 7538, 3
...略
)
Golang + Gin でリダイレクト
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func (c *gin.Context) {
// ex) ログインページにリダイレクトする
c.Redirect(http.StatusSeeOther, "/signin")
})
r.GET("/signin", func (c *gin.Context) {
fmt.Print("signin")
})
r.Run(":8080")
}
30x それぞれの位置付け
使うものだけ抜粋。
- 301 - 恒久的にそのコンテンツにリダイレクト
- 302 - コンテンツを発見したのでリダイレクト
- 303 - 違うコンテンツだけどリダイレクト
- 307 - 一時的にリダイレクトかけるけど後で301に変更する予定
自分は完全に理解したわけではないので、
とりあえずログイン維持ができなくなってログインページにリダイレクトしたい時などは303にした。
301にしたら、ブラウザがキャッシュしてしまい、
ブラウザのキャッシュをクリアしないと、
永遠にリダイレクト先に飛ばされてしまうというエラーが起きてしまった。
エラー例
- ログイン維持ができなくなった → 301でログインページへリダイレクトしてしまった。
- ログインページでログイン成功 → ログインユーザー専用ページへリダイレクトしたかったのに301でリダイレクトしたためにまたログインページに戻されてしまった。
- 以下何度ログインしてもログインページに戻されるループに陥った。
- ログインページでログイン成功 → ログインユーザー専用ページへリダイレクトしたかったのに301でリダイレクトしたためにまたログインページに戻されてしまった。