fiber/docs/api/redirect.md
Isaac Andrade 4321dfed55
♻️ refactor: Change c.Redirect() default status (#3415)
* Set default redirect response status to 303 SeeOther

Closes #3405

In some browsers, redirect status 302 Found sometimes is used to change
the HTTP verb of the response from what the user set to what was used in
the request. Changing to 303 SeeOther in the default works more like
expected: it defaults to GET and can be overriden by the user.

* Add tests to Redirect default status change.

* Update docs.

* Fix remaining tests to reflect redirect 303 status as the new default. Reflect that in docs/whats_new.md

* Update redirect_test.go

* Fix code review hints

---------

Co-authored-by: Juan Calderon-Perez <835733+gaby@users.noreply.github.com>
Co-authored-by: René <rene@gofiber.io>
2025-05-12 14:56:23 +02:00

6.0 KiB

id, title, description, sidebar_position, toc_max_heading_level
id title description sidebar_position toc_max_heading_level
redirect 🔄 Redirect Fiber's built-in redirect package 5 5

The redirect methods are used to redirect the context (request) to a different URL or route.

Redirect Methods

To

Redirects to the URL derived from the specified path, with a specified status, a positive integer that corresponds to an HTTP status code.

:::info If not specified, status defaults to 303 See Other. :::

func (r *Redirect) To(location string) error
app.Get("/coffee", func(c fiber.Ctx) error {
  // => HTTP - GET 301 /teapot
  return c.Redirect().Status(fiber.StatusMovedPermanently).To("/teapot")
})

app.Get("/teapot", func(c fiber.Ctx) error {
  return c.Status(fiber.StatusTeapot).Send("🍵 short and stout 🍵")
})
app.Get("/", func(c fiber.Ctx) error {
  // => HTTP - GET 303 /foo/bar
  return c.Redirect().To("/foo/bar")
  // => HTTP - GET 303 ../login
  return c.Redirect().To("../login")
  // => HTTP - GET 303 http://example.com
  return c.Redirect().To("http://example.com")
  // => HTTP - GET 301 https://example.com
  return c.Redirect().Status(301).To("http://example.com")
})

Route

Redirects to a specific route along with the parameters and queries.

:::info If you want to send queries and params to a route, you must use the RedirectConfig struct. :::

func (r *Redirect) Route(name string, config ...RedirectConfig) error
app.Get("/", func(c fiber.Ctx) error {
  // /user/fiber
  return c.Redirect().Route("user", fiber.RedirectConfig{
    Params: fiber.Map{
      "name": "fiber",
    },
  })
})

app.Get("/with-queries", func(c fiber.Ctx) error {
  // /user/fiber?data[0][name]=john&data[0][age]=10&test=doe
  return c.Redirect().Route("user", fiber.RedirectConfig{
    Params: fiber.Map{
      "name": "fiber",
    },
    Queries: map[string]string{
      "data[0][name]": "john",
      "data[0][age]":  "10",
      "test":          "doe",
    },
  })
})

app.Get("/user/:name", func(c fiber.Ctx) error {
  return c.SendString(c.Params("name"))
}).Name("user")

Back

Redirects back to the referer URL. It redirects to a fallback URL if the referer header doesn't exist, with a specified status, a positive integer that corresponds to an HTTP status code.

:::info If not specified, status defaults to 303 See Other. :::

func (r *Redirect) Back(fallback string) error
app.Get("/", func(c fiber.Ctx) error {
  return c.SendString("Home page")
})

app.Get("/test", func(c fiber.Ctx) error {
  c.Set("Content-Type", "text/html")
  return c.SendString(`<a href="/back">Back</a>`)
})

app.Get("/back", func(c fiber.Ctx) error {
  return c.Redirect().Back("/")
})

Controls

:::info Methods are chainable. :::

Status

Sets the HTTP status code for the redirect.

:::info It is used in conjunction with To, Route, and Back methods. :::

func (r *Redirect) Status(status int) *Redirect
app.Get("/coffee", func(c fiber.Ctx) error {
  // => HTTP - GET 301 /teapot
  return c.Redirect().Status(fiber.StatusMovedPermanently).To("/teapot")
})

RedirectConfig

Sets the configuration for the redirect.

:::info It is used in conjunction with the Route method. :::

// RedirectConfig is a config to use with Redirect().Route()
type RedirectConfig struct {
  Params  fiber.Map         // Route parameters
  Queries map[string]string // Query map
}

Flash Message

Similar to Laravel, we can flash a message and retrieve it in the next request.

Messages

Get flash messages. Check With for more information.

func (r *Redirect) Messages() map[string]string
app.Get("/", func(c fiber.Ctx) error {
  messages := c.Redirect().Messages()
  return c.JSON(messages)
})

Message

Get a flash message by key. Check With for more information.

func (r *Redirect) Message(key string) *Redirect
app.Get("/", func(c fiber.Ctx) error {
  message := c.Redirect().Message("status")
  return c.SendString(message)
})

OldInputs

Get old input data. Check WithInput for more information.

func (r *Redirect) OldInputs() map[string]string
app.Get("/", func(c fiber.Ctx) error {
  oldInputs := c.Redirect().OldInputs()
  return c.JSON(oldInputs)
})

OldInput

Get old input data by key. Check WithInput for more information.

func (r *Redirect) OldInput(key string) string
app.Get("/name", func(c fiber.Ctx) error {
  oldInput := c.Redirect().OldInput("name")
  return c.SendString(oldInput)
})

With

You can send flash messages by using With().

func (r *Redirect) With(key, value string) *Redirect
app.Get("/login", func(c fiber.Ctx) error {
  return c.Redirect().With("status", "Logged in successfully").To("/")
})

app.Get("/", func(c fiber.Ctx) error {
  // => Logged in successfully
  return c.SendString(c.Redirect().Message("status"))
})

WithInput

You can send input data by using WithInput(). They will be sent as a cookie.

This method can send form, multipart form, or query data to the redirected route depending on the request content type.

func (r *Redirect) WithInput() *Redirect
// curl -X POST http://localhost:3000/login -d "name=John"
app.Post("/login", func(c fiber.Ctx) error {
  return c.Redirect().WithInput().Route("name")
})

app.Get("/name", func(c fiber.Ctx) error {
  // => John
  return c.SendString(c.Redirect().OldInput("name"))
}).Name("name")