使用 Express 重定向

4,684 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

使用 Express 重定向res.redirect() 方法允许您通过发送状态为 302 的 HTTP 响应,将用户重定向到不同的 URL 。HTTP 客户端(浏览器、Axios 等)随后将“遵循”重定向并向新 URL 发送 HTTP 请求,如下所示。

const app = require('express')()

// 默认情况下,res.redirect() 方法返回 HTTP 302。当 HTTP 客户端收到状态为 302 的响应时,它将向响应中的 URL 发送 HTTP 请求,在本例中为 /to
app.get('/from', (req, res) => {
  res.redirect('/to')
})

app.get('/to', (req, res) => res.send('Hello, World!'))

await app.listen(5000)

const res = await axios.get('http://localhost:5000/from')

// Axios 遵循重定向并发送 GET /to 请求,因此响应将包含字符串 Hello,World!
console.log(res.data)

res.redirect() 方法还允许您指定 302 以外的 HTTP 状态。302 状态被视为临时重定向,这意味着搜索引擎仍将抓取现有 URL。如果要指示 URL 已永久更改,则应发送 HTTP 状态为 301的响应。

const app = require('express')()

app.get('/from', (req, res) => {
  // res.redirect() 的可选第一个参数是数字 HTTP 状态。
  res.redirect(301, '/to')
})
app.get('/to', (req, res) => res.send('Hello, World!'))

await app.listen(5000)

const res = await axios.get('http://localhost:5000/from')

console.log(res.data) // "Hello, World!"

处理 POST 请求

对于 POST 请求应该使用哪种状态代码,存在一些细微差别。严格地说,HTTP 301 和 302 在重定向时不需要保留相同的方法和正文内容。如果要重定向 POST 请求,应该使用 HTTP 307 替换 HTTP 302,使用 HTTP 308 替换 HTTP 301。

const express = require('express')
const app = express()

app.use(express.json())

app.post('/from', (req, res) => {
  res.redirect(307, '/to')
})
app.post('/to', (req, res) => res.send(req.body.message))

await app.listen(5000)

const res = await axios.post('http://localhost:5000/from', {
  message: 'Hello, World!'
})

console.log(res.data) // "Hello, World!"

以下是这些常见重定向状态之间权衡的简要总结。

301302307308
永久的
相同的方法