π Redirect
Redirect helpers send the client to another URL or route.
Redirect Methodsβ
Toβ
Redirects to a URL built from the given path. Optionally set an HTTP status.
If unspecified, 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).SendString("π΅ 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 http://example.com
return c.Redirect().Status(301).To("http://example.com")
})
Routeβ
Redirects to a named route with parameters and queries.
To send params and queries to a route, 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")
Route returns fiber.ErrNotFound when no route has the given name. Values in Queries are percent-encoded and keys are written as given. The order of the query parameters is not specified.
Each Params value is automatically percent-encoded with URL path-segment
rules. Greedy parameters (* and +) preserve / inside the matched path
tail; delimiters such as ? and # remain parameter data instead of adding a
query or fragment, and cannot absorb or discard Queries.
Route.URL and GetRouteURL apply
the same encoding.
These take the value as data, not as URL text. Representable values use the same
encoding under any configuration. With UnescapePath off (the default) c.Params
returns the value still percent-encoded, so forwarding it straight back encodes
the % a second time. Turn UnescapePath on, or decode with
url.PathUnescape first.
An app with UnescapePath enabled decodes %2F before route matching, so an
ordinary single-segment parameter holding a / cannot round-trip and returns
ErrRouteNotRepresentable. Greedy (* or +), adjacent single-byte parameters
and required parameters with a single-byte non-slash terminator retain their
existing slash-matching rules. An optional parameter with such a terminator does
not match a /, so a decoded / in its value returns ErrRouteNotRepresentable.
Dot-containing values are also rejected when the composed path has a . or
.. segment that would be removed during normalization. Surrounding route
constants are considered: :name.txt with name="." remains representable.
Pass a different value or use a route that can represent it; do not pre-encode it.
Backβ
Redirects to the referer. If it's missing, fall back to the provided URL. You can also set the status code.
If unspecified, status defaults to 303 See Other.
The referer is only used when it is same-origin with the current request, and
the value sent in Location is a normalized form of it, not the raw header.
The check reads the referer the way a browser does β folding backslashes,
dropping ASCII tab, CR and LF, and collapsing a leading run of slashes β so a
value like /\evil.com, which a browser resolves to //evil.com, is not
mistaken for a local path. A referer that is missing, cross-origin, or
unparsable falls back to the provided URL. If there is no fallback either,
Back returns fiber.ErrRedirectBackNoFallback, an error with status 500.
This browser-style normalization applies to the referer checked by Back, not to every redirect API or the fallback URL. The HTTP client instead rejects upstream Location values containing control bytes rather than removing them and following a changed target.
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β
Methods are chainable.
Statusβ
Sets the HTTP status code for the redirect.
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.
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.
Flash messages travel in the fiber_flash cookie (fiber.FlashCookieName), so only a client that keeps cookies across the redirect (a browser, typically) receives them, and every request is scanned for the cookie. Deployments whose clients keep no cookies can turn the feature off with fiber.Config{DisableFlashMessages: true}: With and WithInput then set no cookie, Messages and OldInput report nothing, and the scan is skipped.
The next request that carries the cookie can read the data, and Fiber expires the cookie on that request, so it is delivered once. The accessors return these types:
// FlashMessage is returned by Messages and Message.
type FlashMessage struct {
Key string
Value string
Level uint8
}
// OldInputData is returned by OldInputs and OldInput.
type OldInputData struct {
Key string
Value string
}
Messagesβ
Retrieve all flash messages. Reading removes them from the request, so a second call returns none. See With for details.
func (r *Redirect) Messages() []FlashMessage
app.Get("/", func(c fiber.Ctx) error {
messages := c.Redirect().Messages()
return c.JSON(messages)
})
Messageβ
Get a flash message by key; see With. It returns an empty FlashMessage when the key is not found and, like Messages, removes the message it returns.
func (r *Redirect) Message(key string) FlashMessage
app.Get("/", func(c fiber.Ctx) error {
message := c.Redirect().Message("status")
return c.SendString(message.Value)
})
OldInputsβ
Retrieve stored input data. See WithInput.
func (r *Redirect) OldInputs() []OldInputData
app.Get("/", func(c fiber.Ctx) error {
oldInputs := c.Redirect().OldInputs()
return c.JSON(oldInputs)
})
OldInputβ
Get stored input data by key; see WithInput. It returns an empty OldInputData when the key is not found.
func (r *Redirect) OldInput(key string) OldInputData
app.Get("/name", func(c fiber.Ctx) error {
oldInput := c.Redirect().OldInput("name")
return c.SendString(oldInput.Value)
})
Withβ
Send flash messages with With. The optional level sets the message's Level and defaults to 0. Calling With again with the same key replaces the earlier message.
func (r *Redirect) With(key, value string, level ...uint8) *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").Value)
})
WithInputβ
Send input data with WithInput, which stores them in a cookie.
It captures form, multipart, or query data depending on the request content type.
WithInput copies the whole submitted body into the fiber_flash cookie β a
rejected login carries the password the user just typed. The payload is
hex-encoded, not encrypted or signed, so anything sensitive in the request goes
back to the browser as a cookie value. Prefer With for the specific fields you
need to carry across the redirect.
The cookie is HttpOnly, and Secure when the request that produced it arrived
over TLS β so script cannot read it and it is not replayed in the clear. Neither
attribute protects the payload from whoever is at the browser.
Browsers typically drop a cookie larger than about 4 KB, and Fiber sets no flash cookie at all when a redirect carries more than 256 entries (messages plus input fields), so a large form does not make the round trip.
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").Value)
}).Name("name")