如何在Nodejs中将用户浏览器的URL重定向到另一个页面?

112

我正在尝试编写的应用程序中,主页(http://localhost:8675)具有以下形式:

<form action='/?joinnew' method='post'>
  <button>Start</button>
</form>

以下是 server.js 中的代码:

http.createServer(function(request, response) {
  var root = url.parse(request.url).pathname.split('/')[1];
  if (root == '') {
    var query = url.parse(request.url).search:
    if (query == '?joinnew') {
      var newRoom = getAvaliableRoomId(); // '8dn1u', 'idjh1', '8jm84', etc.
      // redirect the user's web browser to a new url
      // ??? How to do.  Need to redirect to 'http://whateverhostthiswillbe:8675/'+newRoom
...
}}}

如果不用知道主机地址的话,我希望有一种方法可以实现它。

'http'对象是一个常规的require('http'),而不是require('express')。

6个回答

178

要实现重定向,你需要发送一个重定向状态码(301用于永久重定向,302用于“这个内容当前存在于其他页面”的重定向,307用于意图为临时重定向的情况):

response.writeHead(301, {
  Location: `http://whateverhostthiswillbe:8675/${newRoom}`
}).end();

14
在Node中,您还可以使用response.writeHead(301,{Location:'/path'});而无需完整的URL。这对于您事先不知道主机名或协议时非常有用。 - adriaan
5
如果您不希望Chrome永久缓存重定向,请使用代码307!在上述情况下,返回301会导致浏览器始终加入相同的房间,即使您的服务器告诉它一个不同/新的房间! - Brian Ellis
你好,反向重定向怎么样?从远程URL到本地主机页面? - Arj 1411
但请注意,您几乎肯定希望使用302而不是301,以便浏览器不会硬缓存重定向。因为如果它这样做了,即使您将该重定向删除,它也会坚持使用它。您说它是永久的,浏览器相信了您。 - Mike 'Pomax' Kamermans

128

对于那些(与 OP 不同的)使用 Express 库的人:

http.get('*',function(req,res){  
    res.redirect('http://exmple.com'+req.url)
})

14
为了得到适当的信用,可以在您的项目中包含以下引用:https://dev59.com/G2s05IYBdhLWcg3wGuKd。这个链接提供了有关如何使用Node.js和Express进行自动HTTPS连接重定向的信息。 - David Seholm
2
能否在不使用“express”包的情况下完成它? - Tanaki
谢谢。这正是我所需要的。 - liza
3
不回答问题。 - Alex Jone
3
它确实提供了额外有用的信息。在 Stack Overflow 上的回答不应总是被视为独立的。 - Paul Stelian

36

OP:“如果有一种方法,我不需要知道主机地址就能完成它,我会很喜欢…”

response.writeHead(301, {
  Location: "http" + (request.socket.encrypted ? "s" : "") + "://" + 
    request.headers.host + newRoom
});
response.end();

6
在 Express 中,您可以使用 res.redirect('http://example.com'); 将用户从服务器重定向。如果需要包含状态码 301 或 302,则可以使用以下方式:
res.redirect(301, 'http://example.com');

5

如果你正在使用Express,最简洁的完整答案如下:

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

app.get('*', (req, res) => {
  // REDIRECT goes here
  res.redirect('https://www.YOUR_URL.com/')
})

app.set('port', (process.env.PORT || 3000))
const server = app.listen(app.get('port'), () => {})

0

你可以使用 res.render() 或 res.redirect() 方法来使用 node.js express 重定向到另一个页面

例如:

var bodyParser = require('body-parser');
var express = require('express');
var navigator = require('web-midi-api');
var app = express();

app.use(express.static(__dirname + '/'));
app.use(bodyParser.urlencoded({extend:true}));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', __dirname);

app.get('/', function(req, res){
    res.render("index");
});

//This reponds a post request for the login page
app.post('/login', function (req, res) {
    console.log("Got a POST request for the login");
    var data = {
        "email": req.body.email,
        "password": req.body.password
    };

    console.log(data);

    //Data insertion code
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("college");
        var query = { email: data.email };
        dbo.collection("user").find(query).toArray(function(err, result) {
            if (err) throw err;
            console.log(result);
            if(result[0].password == data.password)


 res.redirect('dashboard.html');
            else


 res.redirect('login-error.html');
            db.close();
        });
    });

});


// This responds a POST request for the add user
app.post('/insert', function (req, res) {
    console.log("Got a POST request for the add user");

    var data = {
        "first_name" : req.body.firstName,
        "second_name" : req.body.secondName,
        "organization" : req.body.organization,
        "email": req.body.email,
        "mobile" : req.body.mobile,
    };

    console.log(data);

    **res.render('success.html',{email:data.email,password:data.password});**

});


//make sure that Service Workers are supported.
if (navigator.serviceWorker) {
    navigator.serviceWorker.register('service-worker.js', {scope: '/'})
        .then(function (registration) {
            console.log(registration);
        })
        .catch(function (e) {
            console.error(e);
        })
} else {
    console.log('Service Worker is not supported in this browser.');
}


// TODO add service worker code here
if ('serviceWorker' in navigator) {
    navigator.serviceWorker
        .register('service-worker.js')
        .then(function() { console.log('Service Worker Registered'); });
}

var server = app.listen(63342, function () {

    var host = server.address().host;
    var port = server.address().port;

    console.log("Example app listening at http://localhost:%s", port)
});

在登录部分,如果电子邮件和密码与数据库中的匹配,则将网站重定向到dashbaord.html,否则我们将使用res.redirect()方法显示page-error.html。此外,您可以使用res.render()在node.js中呈现页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接