Skip to content

Redirect Responses ​

The ctx.send.redirect() method creates a redirect response to another URL. The default status is 302 (temporary redirect). The accepted statuses are 301, 302, 303, 307, and 308, so any other status throws Deno.errors.InvalidData.

Basic Usage ​

typescript
import type { 
Context
} from '@neabyte/deserve'
export function
GET
(
ctx
:
Context
): Response {
// Defaults to a 302 redirect return
ctx
.
send
.
redirect
('https://example.com')
}

With Custom Status Code ​

typescript
// Permanent redirect (301)
export function 
permanent
(
ctx
:
Context
): Response {
return
ctx
.
send
.
redirect
('https://example.com', 301)
} // Temporary redirect (302), the default export function
temporary
(
ctx
:
Context
): Response {
return
ctx
.
send
.
redirect
('https://example.com', 302)
} // See Other (303) export function
seeOther
(
ctx
:
Context
): Response {
return
ctx
.
send
.
redirect
('https://example.com', 303)
} // Temporary, keep method (307) export function
keepTemporary
(
ctx
:
Context
): Response {
return
ctx
.
send
.
redirect
('https://example.com', 307)
} // Permanent, keep method (308) export function
keepPermanent
(
ctx
:
Context
): Response {
return
ctx
.
send
.
redirect
('https://example.com', 308)
}

With Custom Headers ​

The third argument carries extra response headers:

typescript
export function 
GET
(
ctx
:
Context
): Response {
// Redirect 302 with one extra header return
ctx
.
send
.
redirect
('/dashboard', 302, {
headers
: {
'X-Redirect-Reason': 'login' } }) }

URL Resolution ​

A relative target resolves against the current request URL and must stay on the same origin, which guards against open redirects. To send a visitor to another site, pass a full https:// URL on purpose:

typescript
export function 
GET
(
ctx
:
Context
): Response {
// Same-origin relative path, resolved safely return
ctx
.
send
.
redirect
('/login')
}

The target must use the http or https scheme. A relative path that resolves to a different origin, a non-http scheme, or an unparseable URL throws Deno.errors.InvalidData. Any Location passed through the headers is ignored, since the resolved URL always wins.

Method Signature ​

typescript
ctx.send.redirect(
  url: string,
  status?: 301 | 302 | 303 | 307 | 308,
  options?: { headers?: HeadersInit }
): Response
  • url - target location for the redirect
  • status - redirect status, defaults to 302
  • options - optional response headers

Released under the MIT License.