Golang + Gin にてリダイレクトする時は301?302?303?307?

リダイレクトする時、
ステータスコードを気にしたことはあまりなくて、
とりあえず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でリダイレクトしたためにまたログインページに戻されてしまった。
      • 以下何度ログインしてもログインページに戻されるループに陥った。