Nodejs - Redirecionar url

118

Como faço para que um servidor node.js redirecione os usuários para uma página 404.html quando eles inserem um url inválido?

Fiz algumas pesquisas e parece que a maioria dos resultados são para Express, mas quero escrever meu servidor em node.js. puro.

Dzung Nguyen
fonte
1
Eu costumava acreditar que meu aplicativo era melhor em node.js puro, mas fiquei MUITO feliz depois de instalar o express. Não consigo imaginar uma arquitetura de serviço web SPA / RESTful node sem Express now.
Graham de

Respostas:

192

A lógica de determinar um url "errado" é específica para seu aplicativo. Pode ser um erro de arquivo simples não encontrado ou outra coisa se você estiver fazendo um aplicativo RESTful. Depois de descobrir isso, enviar um redirecionamento é tão simples como:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();
Chetan S
fonte
não mostra minha página 404 html, talvez mostre apenas o cabeçalho.
Dzung Nguyen
7
@Magic Não é verdade. Experimente Location: /e isso o redirecionará para a pasta raiz.
user3459110
Concordo com Awal. Estou usando'Location': '/path/to/my/servers/content'
Millie Smith
73

É possível usar:

res.redirect('your/404/path.html');
Daniël W. Crompton
fonte
73
Apenas no expresso. Não no aplicativo node.js nativo.
Sergey Yarotskiy
@TarunG Obrigado pelo comentário, se você olhar para o histórico de edição da questão, verá que nem sempre foi tão claro.
Daniël W. Crompton
2
No meu caso, res.redirect ('/ login') apenas envia o conteúdo login.html na resposta da chamada ajax feita. Como prefiro abrir a página?
Tarun
Postagem antiga, mas talvez você esteja procurando por algo como res.direct (' localhost: 5000 / login' ), especialmente se você estiver executando seu servidor expresso em uma porta diferente do seu frontend, como acontece de eu estar.
jboxxx
18

Para indicar um arquivo / recurso ausente e servir uma página 404, você não precisa redirecionar. Na mesma solicitação, você deve gerar a resposta com o código de status definido como 404 e o conteúdo da sua página HTML 404 como corpo da resposta. Aqui está o código de amostra para demonstrar isso em Node.js.

var http = require('http'),
    fs = require('fs'),
    util = require('util'),
    url = require('url');

var server = http.createServer(function(req, res) {
    if(url.parse(req.url).pathname == '/') {
        res.writeHead(200, {'content-type': 'text/html'});
        var rs = fs.createReadStream('index.html');
        util.pump(rs, res);
    } else {
        res.writeHead(404, {'content-type': 'text/html'});
        var rs = fs.createReadStream('404.html');
        util.pump(rs, res);
    }
});

server.listen(8080);
Chandra Sekar
fonte
10

404 com Conteúdo / Corpo

res.writeHead(404, {'Content-Type': 'text/plain'});                    // <- redirect
res.write("Looked everywhere, but couldn't find that page at all!\n"); // <- content!
res.end();                                                             // that's all!

Redirecionar para Http s

res.writeHead(302, {'Location': 'https://example.com' + req.url});
res.end();

Considere onde você usa isso (por exemplo, apenas para solicitação http), para que você não obtenha redirecionamentos infinitos ;-)

Levita
fonte
7

Usei uma instrução switch, com o padrão como 404:

var fs = require("fs");
var http = require("http");

function send404Response (response){
    response.writeHead(404, {"Content-Type": "text/html"});
    fs.createReadStream("./path/to/404.html").pipe(response);
}

function onRequest (request, response){
    switch (request.url){
        case "/page1":
            //statements
            break;
        case "/page2":
            //statements
            break;
        default:
        //if no 'match' is found
            send404Response(response);
            break;
    }
}

http.createServer(onRequest).listen(8080);
Alon e Idan
fonte
5

Experimente isto:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();
Mike
fonte
1
Este é provavelmente um Expresstrecho de código que OP pediu node.jscódigo puro
Refael Ackermann
Não é um código expresso. Isso se parece com o código do nó vanilla, exceto pela thisparte. No NodeJS, você escreve um manipulador que aceita dois parâmetros (request, response)e todas as chamadas na resposta estão no responseobjeto.
AlexChaffee
1

Você deve usar o seguinte código:

response.writeHead(302 , {
           'Location' : '/view/index.html' // This is your url which you want
        });
response.end();
Arash Keivan
fonte
0

Use o código a seguir; isso funciona bem em Nodejs Nativos

http.createServer(function (req, res) {
var q = url.parse(req.url, true);
if (q.pathname === '/') {
  //Home page code
} else if (q.pathname === '/redirect-to-google') {
  res.writeHead(301, { "Location": "http://google.com/" });
  return res.end();
} else if (q.pathname === '/redirect-to-interal-page') {
  res.writeHead(301, { "Location": "/path/within/site" });
  return res.end();
} else {
    //404 page code
}
res.end();
}).listen(8080);
Krishnamoorthy Acharya
fonte