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.


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

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

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

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


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

5

Prueba esto:

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

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

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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.