zoukankan      html  css  js  c++  java
  • express url跳转(重定向)的实现:res.location() res.redirect()

    Express 是一个基于Node.js 实现的web框架,其响应HTTP请求的response对象中有两个响应url跳转方法res.location() res.redirect(),可以实现301 302重定向

    1 res.location()

    2 re.redirect()

    res.location(path)

    设置响应的HTTP Location头,path可以是一下几种设置形式:

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

    path参数可以是一个绝对路径 相对路径 标准的url或是’back‘.当path是’back‘时,响应的location头会被设置为当前请求的referer头,当referer头不存在时会被设置为’/‘

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

    res.redirect([status,]path)

    status:{number}表示要设置的HTTP状态码

    path:{string}要设置到location头中的URL

    重定义到path所指定的URL,重定向时可以同时指定HTTP状态码,不指定状态码默认是302

    与location相比,redirect除了要设置path外,还可以指定一个状态码,而path参数则于location完全相同,

    使用redirect()重定向时,可以是几下几种设置方式:

    res.redirect('/foo/bar');
    res.redirect('http://itbilu.com');
    res.redirect(301, 'http://itbilu.com');
    res.redirect('http://itbilu.com', 301);
    res.redirect('../login'); // /blog/post/1 -> /blog/login
    res.redirect('back');

    url重定向原理

    进行url重定向时,服务器只在响应信息的http信息中设置http状态码和location头信息,

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

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

    location与redirect的比较

    Express的response对象,时对Node.js原生对象ServerResponse的扩展,location方法只会设置location头,而redirect() 除了

    可以设置location头外还可以手动或者自动设置HTTP状态码,理论上讲两者都可以实现重定向。

    location()方法

    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()方法

    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()方法后,其后的代码都不会被执行。

    3.3 重定向与不重定向

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

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

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

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

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

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

    参考:https://www.jb51.net/article/110624.htm

  • 相关阅读:
    (mysql)卸载5.0安装6.05出现“Error Nr. 2003 : Can't connect to MySQL server on 'localhost' (10061). ”的解决办法
    (Redundancy)关于服务器冗余的几个疑问,请知道的帮忙解答.
    (C#)XML文件操作3
    POJ 3635 Full Tank(最短路径变形 + 优先队列)
    POJ 2286 The Rotation Game(DFS + 迭代加深)
    POJ 1141 Brackets Sequence(区间DP + 打印路径)
    POJ 3460 Booksort(IDA* + 估价函数设计)
    POJ 2908 Quantum(BFS + 优先队列)
    NOI 1997 积木游戏(解题报告)
    NYOJ 110 决斗(区间DP + 黑书例题)
  • 原文地址:https://www.cnblogs.com/xiaofenguo/p/11504934.html
Copyright © 2011-2022 走看看