Nodejs - URL di reindirizzamento


118

Come faccio a fare in modo che un server node.js reindirizzi gli utenti a una pagina 404.html quando inseriscono un URL non valido?

Ho effettuato alcune ricerche e sembra che la maggior parte dei risultati siano per Express, ma voglio scrivere il mio server in puro node.js.


1
Credevo che la mia app fosse migliore in pure node.js, ma sono stato MOLTO felice dopo aver installato Express. Non riesco a immaginare un'architettura del servizio Web Node SPA / RESTful senza Express ora.
Graham

Risposte:


193

La logica per determinare un URL "sbagliato" è specifica della tua applicazione. Potrebbe essere un semplice errore di file non trovato o qualcos'altro se stai facendo un'app RESTful. Dopo averlo capito, inviare un reindirizzamento è semplice come:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();

non mostra la mia pagina 404 html, forse mostra solo l'intestazione.
Dzung Nguyen

7
@Magic Non è vero. Prova Location: /e ti reindirizzerà alla cartella principale.
user3459110

D'accordo con Awal. Sto usando'Location': '/path/to/my/servers/content'
Millie Smith

73

È possibile utilizzare:

res.redirect('your/404/path.html');

73
Solo in espresso. Non nell'app native node.js.
Sergey Yarotskiy

@TarunG Grazie per il commento, se guardi la cronologia delle modifiche della domanda vedi che non è sempre stato così chiaro.
Daniël W. Crompton

2
Nel mio caso res.redirect ('/ login') invia semplicemente il contenuto login.html nella risposta della chiamata ajax effettuata. Come preferisco aprire la pagina?
Tarun

Vecchio post, ma forse stai cercando qualcosa come res.direct (' localhost: 5000 / login' ), specialmente se stai eseguendo il tuo server express su una porta diversa dal tuo frontend come mi capita di essere.
jboxxx

18

Per indicare un file / risorsa mancante e servire una pagina 404, non è necessario reindirizzare. Nella stessa richiesta devi generare la risposta con il codice di stato impostato su 404 e il contenuto della tua pagina HTML 404 come corpo della risposta. Ecco il codice di esempio per dimostrarlo in 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 contenuto / 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!

Reindirizza a Http s

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

Considera solo dove lo usi (ad es. Solo per richieste http), in modo da non ottenere reindirizzamenti infiniti ;-)


7

Ho usato un'istruzione switch, con il valore predefinito 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

Prova questo:

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

1
Questo è probabilmente uno Expresssnippet di codice richiesto da OP per il node.jscodice puro
Refael Ackermann

Non è un codice Express. Questo sembra codice vanilla Node tranne per la thisparte. In NodeJS scrivi un gestore che accetta due parametri (request, response)e tutte quelle chiamate nella risposta sono responsesull'oggetto.
AlexChaffee

1

Devi usare il seguente codice:

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

0

Usa il codice seguente che funziona bene in 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.