Nodejs - URL-адреса переадресації


118

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

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


1
Раніше я вважав, що мій додаток краще в чистому node.js, але був ДУЖЕ щасливий після установки express. Я не можу уявити вузол SPA / RESTful архітектура веб-служб без експресу зараз.
— Грем

Відповіді:


193

Логіка визначення "неправильної" URL-адреси є специфічною для вашої програми. Це може бути проста помилка файлу, яку не знайдено, або щось інше, якщо ви робите програми RESTful. Після того як ви це зрозуміли, надіслати переспрямування так само просто, як:

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

він не показує мою сторінку 404 html, можливо, це просто показ заголовка.
— Джунг Нгуен

7
@Magic Неправда. Спробуйте, Location: /і це перенаправить вас до кореневої папки.
— користувач3459110

Домовились з Awal. Я використовую'Location': '/path/to/my/servers/content'
— Міллі Сміт

73

Можна використовувати:

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

73
Тільки в експресі. Не в рідному додатку node.js
— Сергій Яроцький

@TarunG Дякую за коментар, якщо ви подивитесь на історію редагування питання, ви побачите, що це не завжди було так зрозуміло.
— Daniël W. Crompton

2
У моєму випадку res.redirect ('/ login') просто надсилає вміст login.html у відповідь на здійснений виклик Ajax. Як я краще відкрию сторінку?
— Тарун

Стара публікація, але, можливо, ви шукаєте щось на зразок res.direct (' localhost: 5000 / login' ), особливо якщо ви працюєте з експрес-сервером на іншому порту, ніж ваш інтерфейс, як я.
— jboxxx

18

Щоб вказати на відсутній файл / ресурс та обслуговувати сторінку 404, вам не потрібно переадресовувати. У цьому ж запиті ви повинні генерувати відповідь з кодом статусу, встановленим на 404, та вмістом вашої сторінки 404 HTML як органу відповіді. Ось зразок коду, щоб продемонструвати це в 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

Я використовував оператор перемикання, за замовчуванням як 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.