Nodejs - Url chuyển hướng


118

Làm cách nào để đưa máy chủ node.js chuyển hướng người dùng đến trang 404.html khi họ nhập url không hợp lệ?

Tôi đã thực hiện một số tìm kiếm và có vẻ như hầu hết các kết quả đều dành cho Express, nhưng tôi muốn viết máy chủ của mình trong node.js thuần túy.


1
Tôi từng tin rằng ứng dụng của mình tốt hơn trong node.js thuần túy, nhưng tôi RẤT hài lòng sau khi cài đặt express. Tôi không thể tưởng tượng được kiến ​​trúc dịch vụ web SPA / RESTful nút mà không có express bây giờ.
Graham

Câu trả lời:


192

Logic của việc xác định url "sai" là dành riêng cho ứng dụng của bạn. Đó có thể là lỗi không tìm thấy tệp đơn giản hoặc một cái gì đó khác nếu bạn đang thực hiện một ứng dụng RESTful. Khi bạn đã hiểu ra điều đó, việc gửi chuyển hướng đơn giản như sau:

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

nó không hiển thị trang html 404 của tôi, có thể nó chỉ hiển thị tiêu đề.
Dzung Nguyen,

7
@Magic Không đúng. Hãy thử Location: /và nó sẽ chuyển hướng bạn đến thư mục gốc.
user3459110

Đồng ý với Awal. Tôi đang sử dụng'Location': '/path/to/my/servers/content'
Millie Smith

73

Có thể sử dụng:

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

73
Chỉ diễn đạt. Không có trong ứng dụng node.js gốc.
Sergey Yarotkiy

@TarunG Cảm ơn bạn đã nhận xét, nếu bạn nhìn vào lịch sử chỉnh sửa của câu hỏi, bạn sẽ thấy rằng điều này không phải lúc nào cũng rõ ràng như vậy.
Daniël W. Crompton

2
Trong trường hợp của tôi, res.redirect ('/ login') chỉ gửi nội dung login.html theo phản hồi của lệnh gọi ajax được thực hiện. Làm cách nào để mở trang này?
Tarun

Bài cũ, nhưng có thể bạn đang tìm kiếm thứ gì đó giống như res.direct (' localhost: 5000 / login' ), đặc biệt nếu bạn đang chạy máy chủ express của mình trên một cổng khác với giao diện người dùng của bạn như tôi tình cờ.
jboxxx

18

Để chỉ ra một tệp / tài nguyên bị thiếu và phân phát trang 404, bạn không cần phải chuyển hướng. Trong cùng một yêu cầu, bạn phải tạo phản hồi với mã trạng thái được đặt thành 404 và nội dung của trang HTML 404 của bạn làm nội dung phản hồi. Đây là mã mẫu để chứng minh điều này trong 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 với Nội dung / Nội dung

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!

Chuyển hướng đến Http s

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

Chỉ cần xem xét nơi bạn sử dụng điều này (ví dụ: chỉ cho yêu cầu http), vì vậy bạn không nhận được chuyển hướng vô tận ;-)


7

Tôi đã sử dụng câu lệnh switch, với giá trị mặc định là 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

Thử cái này:

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

1
Đây có lẽ là một ExpressOP đoạn mã yêu cầu tinh khiết node.jsđang
Refael Ackermann

Nó không phải là mã Express. Điều này trông giống như mã Node vani ngoại trừ thisphần. Trong NodeJS, bạn viết một trình xử lý chấp nhận hai tham số (request, response)và tất cả các lệnh gọi đó trong câu trả lời đều nằm trên responseđối tượng.
AlexChaffee

1

Bạn phải sử dụng mã sau:

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

0

Sử dụng mã sau, mã này hoạt động tốt trong Nodejs bản địa

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.