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.


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();

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');

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);

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 ;-)


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);

5

Experimente isto:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();

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();

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.