Nodejs - adres URL przekierowania

118

Co zrobić, aby serwer node.js przekierowywał użytkowników do strony 404.html, gdy wprowadzą nieprawidłowy adres URL?

Wyszukałem trochę i wygląda na to, że większość wyników dotyczy Express, ale chcę napisać mój serwer w czystym pliku node.js.

Dzung Nguyen
źródło
1
Kiedyś wierzyłem, że moja aplikacja jest lepsza w czystym node.js, ale byłem BARDZO zadowolony po zainstalowaniu Express. Nie wyobrażam sobie teraz architektury usług sieciowych SPA / RESTful w węźle bez ekspresu.
Graham

Odpowiedzi:

193

Logika określania „złego” adresu URL jest specyficzna dla Twojej aplikacji. Może to być prosty błąd „Nie znaleziono pliku” lub coś innego, jeśli robisz aplikację RESTful. Gdy już to zrozumiesz, wysłanie przekierowania jest tak proste, jak:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();
Chetan S
źródło
nie pokazuje mojej strony html 404, może po prostu pokazuje nagłówek.
Dzung Nguyen
7
@Magic Nie prawda. Spróbuj, Location: /a przekieruje Cię do folderu głównego.
user3459110
Uzgodniono z Awalem. Używam'Location': '/path/to/my/servers/content'
Millie Smith
73

Możliwe jest użycie:

res.redirect('your/404/path.html');
Daniël W. Crompton
źródło
73
Tylko ekspresowo. Nie w natywnej aplikacji node.js.
Sergey Yarotskiy
@TarunG Dzięki za komentarz, jeśli spojrzysz na historię edycji pytania, zobaczysz, że nie zawsze było to takie jasne.
Daniël W. Crompton,
2
W moim przypadku res.redirect ('/ login') po prostu wysyła zawartość login.html w odpowiedzi na wywołanie ajax. Jak raczej otworzyć stronę?
Tarun
Stary post, ale może szukasz czegoś takiego jak res.direct (' localhost: 5000 / login' ), szczególnie jeśli używasz swojego serwera ekspresowego na innym porcie niż frontend, tak jak ja.
jboxxx
18

Aby wskazać brakujący plik / zasób i udostępnić stronę 404, nie musisz przekierowywać. W tym samym żądaniu należy wygenerować odpowiedź z kodem stanu ustawionym na 404 i treścią strony 404 HTML jako treścią odpowiedzi. Oto przykładowy kod pokazujący to w 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
źródło
10

404 z treścią / treścią

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!

Przekieruj do Http s

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

Zastanów się tylko, gdzie tego używasz (np. Tylko dla żądania http), aby nie otrzymywać niekończących się przekierowań ;-)

Lewita
źródło
7

Użyłem instrukcji switch, z wartością domyślną 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 i Idan
źródło
5

Spróbuj tego:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();
Mikrofon
źródło
1
Prawdopodobnie jest to Expressfragment kodu OP proszony o czysty node.jskod
Refael Ackermann
To nie jest kod Express. To wygląda jak waniliowy kod węzła, z wyjątkiem thisczęści. W NodeJS piszesz program obsługi, który akceptuje dwa parametry, (request, response)a wszystkie wywołania w odpowiedzi są naresponse obiektu.
AlexChaffee
1

Musisz użyć następującego kodu:

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

Użyj następującego kodu, który działa dobrze w 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
źródło