Express URL跳转(重定向)的实现方法


Posted in Javascript onApril 07, 2017

Express是一个基于Node.js实现的Web框架,其响应HTTP请求的response对象中有两个用于URL跳转方法res.location()和res.redirect(),使用它们可以实现URL的301或302重定向。

res.location(path)

res.location(path)

下面列举了几种,设置http响应头Location的方法

res.location('/foo/bar');
res.location('http://example.com');
res.location('back');

路径值back具有特殊的意义,这个涉及到请求头Referer中指定的URL,如果Referer头没有指定,将会设置为'/'。

Express通过Location头将指定的URL字符串传递给浏览器,它并不会对指定的字符串进行验证(除'back'外)。而浏览器则负责将当前URL重定义到响应头Location中指定的URL。

res.redirect([status,] path)

其中参数:

  1. status:{Number},表示要设置的HTTP状态码
  2. path:{String},要设置到Location头中的URL

使用指定的http状态码,重定向到指定的URL,如果不指定http状态码,使用默认的状态码”302“:”Found“,

res.redirect('/foo/bar');
res.redirect('http://example.com');
res.redirect(301, 'http://example.com');
res.redirect('../login');

重定向可以是一个完整的URL,这样会重定向到一个不同的站点上。

res.redirect('http://google.com');

重定向也可以相对于所在主机的根目录,例如,如果你的程序运行在:http://example.com/admin/post/new上下面的代码将会重定向到如下地址:http://example.com/admin

res.redirect('/admin');

重定向也可以相对于当前的URL,例如:从http://example.com/blog/admin/这个地址(注意反斜杠),下面的代码将会重定向到地址:http://example.com/blog/admin/post/new

res.redirect('post/new')

在从地址: http://example.com/blog/admin重定向到 post/new,如果没有反斜杠的话将会重定向到:http://example.com/blog/post/new

如果你感觉上面的行为很迷惑,想想文件目录和文件的路径,这会让你更好理解。

相对路径的重定向也是允许的,如果你的地址是: http://example.com/admin/post/new,下面的代码将会重定向到http//example.com/admin/post这个地址:

res.redirect('..');

back重定向,重定向到请求的referer,当没有referer请求头的情况下,默认为‘/'

res.redirect('back');

URL重定向原理

Express URL跳转(重定向)的实现方法

进行URL重定向时,服务器只在响应信息的HTTP头信息中设置了HTTP状态码和Location头信息。

当状态码为301或302时(301-永久重定向、302-临时重定向),表示资源位置发生了改变,需要进行重定向。

Location头信息表示了资源的改变的位置,即:要跳重定向的URL。

 location()与redirect()的比较

Express的response对象,是对Node.js原生对象ServerResponse的扩展。location()方法只会设置Location头,而redirect()方法除了会设置Location头外还可自动或手头设置HTTP状态码。理论上讲两者可以实现重定向。

location()方法实现过程大致如下:

res.location = function(url){
 var req = this.req;

 // "back" 是 referrer的别名
 if ('back' == url) url = req.get('Referrer') || '/';

 // 设置Lcation
 this.setHeader('Location', url);
 return this;
};

从以上代码可以看出,location()方法本质上是调用了ServerResponse对象的setHeader()方法,但并没有设置状态码。通过location()设置头信息后,其后的代码还会执行。

使用location()方法实现URL的重定向,还要手动设置HTTP状态码:

res.location('http://itbilu.com');
res.statusCode = 301;

如果需要立即返回响应信息,还要调用end()方法:

res.location('http://itbilu.com');
res.statusCode = 301;
res.end('响应的内容');

// 或
res.location('http://itbilu.com');
res.sent(302);

redirect()方法实现过程大致如下:

res.redirect = function(url){
 var head = 'HEAD' == this.req.method;
 var status = 302;
 var body;

 // 一些处理
 ……

 // 通过 location 方法设置头信息
 this.location(url);
 
 // 另一些处理
 ……

 // 设置状态并返回响应
 this.statusCode = status;
 this.set('Content-Length', Buffer.byteLength(body));
 this.end(head ? null : body);
};

从以上代码可以看出,redirect()方法是对location()方法的扩展。通过location()设置Loction头后,设置HTTP状态码,最后通过ServerResponse对象的end()方法返回响应信息。调用redirect()方法后,其后的代码都不会被执行

重定向与不重定向

在使用的过程中,redirect()方法大多能重定向成功,而location()方法则不太确定,有时可以成功有时不能成功。这与我们的用法有关。

上面讲过,URL重定向是在浏览器端完成的,而URL重定向与HTTP状态码和Location头有关。浏览器首先会判断状态码,只有当状态码是:301或302时,才会根据Location头中的URL进行跳转。

所以,使用location()设置头信息,而不设置状态码或状态码不是301或302,并不会发生重定向:

res.location('http://itbilu.com');
res.sent(200);

而使用redirect()设置的状态码不是301或302也不会发生跳转:

res.redirect(200, 'http://itbilu.com');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中关于indexOf的使用方法与问题小结
Aug 05 Javascript
基于JQuery制作的产品广告效果
Dec 08 Javascript
Knockout数组(observable)使用详解示例
Nov 15 Javascript
玩转方法:call和apply
May 08 Javascript
js判断登录与否并确定跳转页面的方法
Jan 30 Javascript
javascript实现获取服务器时间
May 19 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
Oct 30 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
微信小程序 首页制作简单实例
Apr 07 #Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 #Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 #Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 #Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 #Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 #Javascript
利用js的闭包原理做对象封装及调用方法
Apr 07 #Javascript
You might like
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
使用PDB简单调试Python程序简明指南
2015/04/25 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
《恐龙》教学反思
2014/04/27 职场文书
环保标语大全
2014/06/12 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python