HTTP协议特性之重定向——NodeJs版
一、 重定向
1、基本介绍
在网页开发中,为了实现资源(如页面、表单等)的高效路由转移,《URL 转发技术》是一种广泛采用的方法。该技术通过 HTTP 协议中的特殊机制实现资源迁移功能。具体而言,在服务器端通过发送特定类型的响应来触发资源路由的变化。根据 HTTP 标准规定,在这种路由变更操作中会返回一个状态码为 300 系列(如 301 永久重定向、302 临时重定向)的响应信息给客户端设备。当浏览器接收到来自服务器的这些特殊指令后,在相应的时间内自动切换到新的地址并开始加载新内容;由于这些指令对用户体验来说是透明无可见性的操作,并且只会带来微乎其微的性能开销(即性能损失几乎 negligible)。
重定向一般用于整站迁移。
2、 Location
Location 首部配置指定了需要将页面重定向至的目标地址。通常情况下,在响应码为3xx的响应中才会具有意义。
3、如何使用重定向?
Heads添加Location字段
二、 临时重定向——302
1、基本介绍
有时无法通过常规路径获取所需资源,
但能通过别处获取。
此时可采用暂时重导的方法。
搜索 engines will not record this temporary link.
当创建、更新或删除资源时,
暂时重导可以用来显示进度页面。
2、状态码:302
3、代码示例:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/img") {
console.log("/img")
//301谨慎使用,否则只有客户自动清除缓存
// response.writeHead(301,"Permanent Redirect",{//此段代码只执行一次
// "Location":"/yxc"
// })
response.writeHead(302,"Temporary Redirect",{
"Location":"/yqx"
})
response.end();
// response.writeHead(200, "OK", {"Content-Type": "text/html; charset=utf-8"});
// response.end("图片请求");
} else if (requestMsg.url === "/yxc") {
console.log("/yxc")
requestMsg.on("data", (data) => {
console.log("data:" + data.toString())
})
response.setHeader("Content-Type", "image/jpeg")
const readS = fs.createReadStream("./imgs/yxc.jpg");
readS.pipe(response);
} else if (requestMsg.url === "/yqx") {
console.log("/yqx")
requestMsg.on("data", (data) => {
console.log("data:" + data.toString())
})
response.setHeader("Content-Type", "image/jpeg")
const readS = fs.createReadStream("./imgs/yqx.jpg");
readS.pipe(response);
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
4、代码说明:
执行上述代码后,如下代码可执行多次:
response.writeHead(302,"Temporary Redirect",{
"Location":"/yqx"
})
代码解释
当更改Location值时,可以重新定位。
三、永久重定向——301
1、基本介绍
此重定向操作具有永久性。此操作表明原始URL不再作为有效引用存在,请以新的URL为准进行引用。当检测到该状态码出现时,请启动更新流程,并在搜索引擎index库中修正相关资源的URL信息。
2、状态码:301
3、代码示例:
const http = require("http");
const fs = require("fs");
const host = "127.0.0.1";
const port = 8080;
const server = http.createServer((requestMsg, response) => {
if (requestMsg.url === "/img") {
console.log("/img")
//301谨慎使用,否则只有客户自动清除缓存
response.writeHead(301,"Permanent Redirect",{//此段代码只执行一次
"Location":"/yxc"
})
// response.writeHead(302,"Temporary Redirect",{
// "Location":"/yqx"
// })
response.end();
// response.writeHead(200, "OK", {"Content-Type": "text/html; charset=utf-8"});
// response.end("图片请求");
} else if (requestMsg.url === "/yxc") {
console.log("/yxc")
requestMsg.on("data", (data) => {
console.log("data:" + data.toString())
})
response.setHeader("Content-Type", "image/jpeg")
const readS = fs.createReadStream("./imgs/yxc.jpg");
readS.pipe(response);
} else if (requestMsg.url === "/yqx") {
console.log("/yqx")
requestMsg.on("data", (data) => {
console.log("data:" + data.toString())
})
response.setHeader("Content-Type", "image/jpeg")
const readS = fs.createReadStream("./imgs/yqx.jpg");
readS.pipe(response);
} else {
response.writeHead(500, "Invalid Request", {"Content-Type": "text/html; charset=utf-8"});
response.end("无效请求");
}
})
server.listen(port, host, () => {
console.log(`server starting at ${host}:${port}`)
})
代码解释
4、代码说明:
执行永久重定向代码后,如下代码只执行一次:
response.writeHead(302,"Temporary Redirect",{
"Location":"/yxc"
})
代码解释
当更改Location值后,
response.writeHead(302,"Temporary Redirect",{
"Location":"/yys"
})
代码解释
一直以来,“Location”: "/yqx"被使用。直到清除缓存后,“Location”: "/yys"才开始采用。
一直以来,“Location”: "/yqx"被使用。直到清除缓存后,“Location”: "/yys"才开始采用。
为了科学配置永久重定向301功能,请务必谨慎操作;一旦设置永久重定向,请注意该行为会导致浏览器持续执行新的操作流程(即不会自动跳转至目标网页),除非及时清除浏览器缓存以解除限制。若需更改目标网站迁移地址,则应在清除浏览器缓存后才能访问新的目标网站;否则将严重影响用户体验的质量。
四、面试点:重定向的三个状态301 302 304
301:永久重定向
302:临时重定向
304:协商缓存
