2010-10-31 52 views
74

Làm cách nào để tải 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ệ?Nodejs - Url chuyển hướng

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 là Express, nhưng tôi muốn viết máy chủ của mình trong nút node.js.

+0

Tôi đã từng tin rằng ứng dụng của tôi tốt hơn trong các node.js thuần túy, nhưng đã rất hài lòng sau khi cài đặt nhanh. Tôi không thể tưởng tượng một kiến ​​trúc dịch vụ web SPA/RESTful nút mà không thể hiện ngay bây giờ. – Graham

Trả lời

133

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

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

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

+1

Vui lòng đọc phần này - http://en.wikipedia.org/wiki/URL_redirection –

+6

Vị trí phải là tiền tố có 'http: //' Hoặc không chuyển hướng thành công. – Magic

16

Để cho biết tệp/tài nguyên bị thiếu và phục vụ trang 404, bạn không cần 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 để minh họa đ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); 
45

Có thể sử dụng:

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

Chỉ hiển thị. Không có trong ứng dụng node.js gốc. –

+0

@TarunG Cảm ơ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 thấy rằng điều này không phải lúc nào cũng rõ ràng. –

+1

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

4

404 với nội dung/Body

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! 

Redirect HTTP s

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

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

4

Hãy thử điều này:

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

Đây có thể là đoạn mã 'Express' OP được yêu cầu cho mã 'node.js' thuần túy –

4

tôi đã sử dụng một câu lệnh switch, với 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); 
Các vấn đề liên quan