Nodejs - URL umleiten


118

Wie kann ich einen node.js-Server dazu bringen, Benutzer auf eine 404.html-Seite umzuleiten, wenn sie eine ungültige URL eingeben?

Ich habe etwas gesucht und es sieht so aus, als ob die meisten Ergebnisse für Express sind, aber ich möchte meinen Server in pure node.js schreiben.


1
Früher glaubte ich, dass meine App in reinen node.js besser war, war aber nach der Installation von Express SEHR glücklich. Ich kann mir keine SPA / RESTful-Webdienstarchitektur für Knoten ohne Express vorstellen.
Graham

Antworten:


192

Die Logik zum Ermitteln einer "falschen" URL ist spezifisch für Ihre Anwendung. Es kann sich um eine einfache Datei handeln, bei der kein Fehler gefunden wurde, oder um etwas anderes, wenn Sie eine RESTful-App ausführen. Sobald Sie das herausgefunden haben, ist das Senden einer Weiterleitung so einfach wie:

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

Meine 404-HTML-Seite wird nicht angezeigt. Vielleicht wird nur der Header angezeigt.
Dzung Nguyen

7
@ Magic Nicht wahr. Versuchen Sie es Location: /und es würde Sie zum Stammordner umleiten.
user3459110

Einverstanden mit Awal. Ich benutze'Location': '/path/to/my/servers/content'
Millie Smith

73

Es ist möglich zu verwenden:

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

73
Nur ausdrücklich. Nicht in der nativen node.js App.
Sergey Yarotskiy

@TarunG Vielen Dank für den Kommentar. Wenn Sie sich den Bearbeitungsverlauf der Frage ansehen, sehen Sie, dass dies nicht immer so klar war.
Daniël W. Crompton

2
In meinem Fall sendet res.redirect ('/ login') lediglich den Inhalt login.html als Antwort auf den Ajax-Aufruf. Wie öffne ich die Seite lieber?
Tarun

Alter Beitrag, aber vielleicht suchen Sie nach etwas wie res.direct (' localhost: 5000 / login' ), besonders wenn Sie Ihren Express-Server an einem anderen Port als Ihrem Frontend ausführen, wie ich es gerade bin.
Jboxxx

18

Um eine fehlende Datei / Ressource anzuzeigen und eine 404-Seite bereitzustellen, müssen Sie nicht umleiten. In derselben Anforderung müssen Sie die Antwort mit dem Statuscode 404 und dem Inhalt Ihrer 404-HTML-Seite als Antworttext generieren. Hier ist der Beispielcode, um dies in Node.js zu demonstrieren.

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 mit Inhalt / Körper

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!

Weiterleiten an HTTP s

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

Überlegen Sie einfach, wo Sie dies verwenden (z. B. nur für http-Anfragen), damit Sie keine endlosen Weiterleitungen erhalten ;-)


7

Ich habe eine switch-Anweisung mit der Standardeinstellung 404 verwendet:

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

Versuche dies:

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

1
Dies ist wahrscheinlich ein ExpressCode-Snippet OP, das nach reinem node.jsCode gefragt wird
Refael Ackermann

Es ist kein Express-Code. Dies sieht mit Ausnahme des thisTeils wie Vanilleknotencode aus . In NodeJS schreiben Sie einen Handler, der zwei Parameter akzeptiert, (request, response)und alle Aufrufe in der Antwort befinden sich im responseObjekt.
AlexChaffee

1

Sie müssen den folgenden Code verwenden:

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

0

Verwenden Sie den folgenden Code, der in Native Nodejs einwandfrei funktioniert

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.