2013-09-27 183 views
5

Tôi đang sử dụng những điều sau để chuyển hướng tất cả các yêu cầu http đến yêu cầu https.Chuyển tiếp http đến https trong ứng dụng tốc độ node.js bằng môi trường EBS & ELB

Tôi có thể thấy từ nhật ký rằng tiêu đề 'x-forwarded-proto' không bao giờ được điền và không được xác định.

app.get('*', function(req, res, next) { 
    //http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-proto 
    if (req.headers['x-forwarded-proto'] != "https") { 
     res.redirect('https://' + req.get('host') + req.url); 
    } else { 
     next();  
    } 
}); 

Nó đang gây ra vòng lặp chuyển hướng. Làm thế nào tôi có thể chuyển hướng đúng cách mà không lặp?

Trả lời

9

chỉnh sửa: câu trả lời ban đầu của tôi dưới đây là dành cho 3.x nhanh, cho 4.x bạn có thể nhận được một chuỗi http hoặc https trong req.protocol, thx @BrandonClark


sử dụng req.get, không req.headers . Lưu ý rằng các yêu cầu POST và tất cả các non-GET khác sẽ không thấy phần mềm trung gian này. Cũng có thể Express không mang tiêu đề x-forwarded-proto khi bạn chuyển hướng. Bạn có thể cần phải đặt nó cho mình.

app.get('*', function(req, res, next) { 
//http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-proto 
    if (req.get('x-forwarded-proto') != "https") { 
     res.set('x-forwarded-proto', 'https'); 
     res.redirect('https://' + req.get('host') + req.url); 
    } else { 
     next();  
    } 
}); 

Một cách khác để buộc https:

function ensureSecure(req, res, next){ 
    if(req.secure){ 
    // OK, continue 
    return next(); 
    }; 
    res.redirect('https://'+req.host+req.url); // handle port numbers if non 443 
}; 

app.all('*', ensureSecure); 
+0

Đã thử các đề xuất của bạn và vẫn không hoạt động. Bộ cân bằng tải đàn hồi không đặt tiêu đề phù hợp. 'res.set ('x-forwarded-proto', 'https');' cũng không hoạt động. – user883499

+0

Tìm hiểu lý do tại sao Amazon không đặt tiêu đề hoặc thử kỹ thuật thứ hai của tôi. Tôi nhận thấy rằng 'res.header' giống hệt' res.set', xin lỗi! – Plato

+1

Kỹ thuật thứ hai cũng sẽ không hoạt động như bộ cân bằng tải cho phép http (req.secure luôn luôn sai) luôn yêu cầu ứng dụng. – user883499

1

Bạn có thể chỉnh sửa các tập tin nginx cấu hình trong trường hợp EC2. SSH để EC2 dụ và làm theo các bước sau

  1. đi đến /etc/nginx/conf.d
  2. mở 00_elastic_beanstalk_proxy.conf sudo vi 00_elastic_beanstalk_proxy.conf
  3. đặt

    location/{ if ($http_x_forwarded_proto != 'https') { rewrite^https://$host$request_uri? permanent; } … }

  4. tải lại nginx sudo /usr/sbin/nginx -s reload