Nodejs - URL-адрес перенаправления

118

Как заставить сервер node.js перенаправлять пользователей на страницу 404.html, когда они вводят недопустимый URL-адрес?

Я немного поискал, и похоже, что большинство результатов для Express, но я хочу написать свой сервер на чистом node.js.

Джунг Нгуен
источник
1
Раньше я считал, что мое приложение лучше на чистом node.js, но был ОЧЕНЬ счастлив после установки Express. Я не могу представить себе архитектуру веб-сервиса node SPA / RESTful без выражения Express.
Грэм

Ответы:

193

Логика определения «неправильного» URL зависит от вашего приложения. Это может быть простая ошибка «файл не найден» или что-то еще, если вы делаете приложение RESTful. Как только вы это поняли, отправить перенаправление так же просто, как:

response.writeHead(302, {
  'Location': 'your/404/path.html'
  //add other headers here...
});
response.end();
Четан С
источник
он не показывает мою страницу 404 html, возможно, он просто показывает заголовок.
Джунг Нгуен
7
@Magic Неправда. Попробуйте, Location: /и он перенаправит вас в корневую папку.
user3459110
Согласен с Авалом. Я использую'Location': '/path/to/my/servers/content'
Милли Смит
74

Можно использовать:

res.redirect('your/404/path.html');
Даниэль В. Кромптон
источник
74
Только в экспресс. Не в собственном приложении node.js.
Сергей Яроцкий
@TarunG Спасибо за комментарий, если вы посмотрите историю редактирования вопроса, вы увидите, что это не всегда было так ясно.
Даниэль В. Кромптон
2
В моем случае res.redirect ('/ login') просто отправляет содержимое login.html в ответ на сделанный вызов ajax. Как мне лучше открыть страницу?
Tarun
Старый пост, но, возможно, вы ищете что-то вроде res.direct (' localhost: 5000 / login' ), особенно если вы используете свой экспресс-сервер на другом порту, чем ваш интерфейс, как и я.
jboxxx
18

Чтобы указать отсутствующий файл / ресурс и обслужить страницу 404, вам не нужно перенаправлять. В том же запросе вы должны сгенерировать ответ с кодом состояния, установленным на 404, и содержимым вашей HTML-страницы 404 в качестве тела ответа. Вот пример кода, демонстрирующий это в 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 с содержимым / телом

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!

Перенаправить на Http s

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

Просто подумайте, где вы это используете (например, только для HTTP-запроса), чтобы не получить бесконечные перенаправления ;-)

левит
источник
7

Я использовал оператор switch со значением по умолчанию 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

Попробуй это:

this.statusCode = 302;
this.setHeader('Location', '/url/to/redirect');
this.end();
Майк
источник
1
Вероятно, это Expressфрагмент кода, который OP запрашивает чистый node.jsкод,
Рефаэль Акерманн,
Это не экспресс-код. Это похоже на ванильный код узла, за исключением thisчасти. В NodeJS вы пишете обработчик, который принимает два параметра, (request, response)и все эти вызовы в ответе относятся к responseобъекту.
AlexChaffee
1

Вы должны использовать следующий код:

response.writeHead(302 , {
           'Location' : '/view/index.html' // This is your url which you want
        });
response.end();
Араш Кейван
источник
0

Используйте следующий код, который отлично работает в 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);
Кришнамурти Ачарья
источник