Nodejs: URL de redireccionamiento

118

¿Cómo consigo que un servidor node.js redirija a los usuarios a una página 404.html cuando ingresan una URL no válida?

Hice algunas búsquedas y parece que la mayoría de los resultados son para Express, pero quiero escribir mi servidor en node.js.

Dzung Nguyen
fuente
1
Solía ​​creer que mi aplicación era mejor en node.js puro, pero he estado MUY feliz después de instalar express. No puedo imaginar una arquitectura de servicio web de nodo SPA / RESTful sin Express ahora.
Graham

Respuestas:

193

La lógica para determinar una URL "incorrecta" es específica de su aplicación. Podría ser un simple error de archivo no encontrado o algo más si está haciendo una aplicación RESTful. Una vez que lo haya descubierto, enviar una redirección es tan simple como:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();
Chetan S
fuente
no muestra mi página 404 html, tal vez solo muestra el encabezado.
Dzung Nguyen
7
@Magic No es cierto. Prueba Location: /y te redirigirá a la carpeta raíz.
user3459110
De acuerdo con Awal. Estoy usando'Location': '/path/to/my/servers/content'
Millie Smith
73

Es posible utilizar:

res.redirect('your/404/path.html');
Daniël W. Crompton
fuente
73
Solo en expreso. No en la aplicación nativa de node.js.
Sergey Yarotskiy
@TarunG Gracias por el comentario, si miras el historial de edición de la pregunta, ves que esto no siempre fue tan claro.
Daniël W. Crompton
2
En mi caso, res.redirect ('/ login') simplemente envía el contenido de login.html en la respuesta de la llamada ajax realizada. ¿Cómo prefiero abrir la página?
Tarun
Publicación anterior, pero tal vez esté buscando algo como res.direct (' localhost: 5000 / login' ), especialmente si está ejecutando su servidor expreso en un puerto diferente al de su interfaz como yo.
jboxxx
18

Para indicar un archivo / recurso faltante y servir una página 404, no es necesario que redirija. En la misma solicitud, debe generar la respuesta con el código de estado establecido en 404 y el contenido de su página HTML 404 como cuerpo de respuesta. Aquí está el código de muestra para demostrar esto en 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
fuente
10

404 con contenido / cuerpo

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!

Redirigir a Http s

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

Solo considere dónde usa esto (por ejemplo, solo para solicitudes http), para que no obtenga redireccionamientos infinitos ;-)

Levita
fuente
7

Usé una declaración de cambio, con la predeterminada 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
fuente
5

Prueba esto:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();
Miguel
fuente
1
Este es probablemente un Expressfragmento de código que OP pidió node.jscódigo puro
Refael Ackermann
No es un código Express. Esto parece un código de nodo vainilla excepto por la thisparte. En NodeJS, escribe un controlador que acepta dos parámetros (request, response)y todas esas llamadas en la respuesta están en el responseobjeto.
AlexChaffee
1

Tienes que usar el siguiente código:

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

Use el siguiente código, esto funciona bien en Native Nodejs

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
fuente