2012-01-26 18 views
19

के पीछे चलने पर HTodePS पर node.js/express.js को कैसे बल दें I AWS पर नोड/एक्सप्रेस सेवा चला रहे हैं और इसके सामने एक ईएलबी तैनात किया है। जब मैं एसएसएल सक्षम के साथ एक ईएलबी इंस्टेंस को स्पिन करता हूं, तो यह पहले पेज के लिए काम करता है, लेकिन उसके बाद प्रत्येक सर्वर एक्सेस के लिए HTTP पर स्विच हो जाता है।एनडब्ल्यूएस लोड बैलेंसर

ईएलबी पर रूटिंग नियम एसएसएल और आगे पोर्ट 8080 को समाप्त करता है जो नोड सुन रहा है।

एसएसएल समाप्ति समाधान मेरे उद्देश्यों के लिए ठीक काम करेगा, लेकिन मैं बाद में सर्वर कॉल HTTPS पर कैसे रख सकता हूं?

+1

क्या आप ग्राहक के लिए http: // 'लिंक लौट रहे हैं? – arx

+0

मुझे एक नहीं मिल रहा है। ग्राहक में सभी पथ रिश्तेदार हैं (AJAX कॉल के लिए)। – Greg

+0

अधिकांश ब्राउज़रों के पास आपके कोड से किए गए सभी कॉल, रीडायरेक्शन की निगरानी आदि का पता लगाने का कुछ साधन होता है। मैं एक ट्रेस चलाता हूं और देखता हूं कि http लिंक कहां से आ रहे हैं (उदाहरण के लिए या तो आपके कोड या दूरदराज के अंतराल से) । – arx

उत्तर

46

मुझे एक ही समस्या का अनुभव हुआ है, लेकिन थोड़ा अलग संदर्भ में। मैं एडब्ल्यूएस लोचदार बीनस्टॉक का उपयोग करके नोड.जेएस/एक्सप्रेस एप्लिकेशन को तैनात कर रहा था और उस पर एक एसएसएल प्रमाणपत्र स्थापित करने में सक्षम था।

इसका नतीजा यह था कि मेरा एप्लिकेशन http और https प्रोटोकॉल दोनों पर पहुंच योग्य था। लोड संतुलन के अनुमार्गण तालिका इस तरह देख रहे थे:

(Load balancer) http 80 --> (Node instance) http 8080 
(Load balancer) https 443 --> (Node instance) http 8080 

तो सवाल यह मेरी Node.js एप्लिकेशन पर केवल https कनेक्शन अधिकृत करने के लिए गया था, लेकिन https करने के लिए पुनर्निर्देशन को सक्षम करने अगर कनेक्शन initialy किया गया था http का उपयोग कर।

क्योंकि एडब्ल्यूएस लोड संतुलन के पीछे, सभी संचार HTTP पर किया जाता है, एक वैश्विक पुनर्निर्देशन अनुदेश इस एक एक अनंत पुनर्निर्देशन लूप तैयार हो जाएगा की तरह (इस मामले में एक मध्यस्थ के रूप):

app.use(function(req, res, next) { 
    if((!req.secure) && (req.protocol !== 'https')) { 
     res.redirect('https://' + req.get('Host') + req.url); 
    } 
} 

- > बस निर्देश के कारण (req.protocol !== 'https') हमेशा सत्य होगा!

इस ब्लॉग पोस्ट (http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html) से, यह पता चला है कि एडब्ल्यूएस ईएलबी एक X-Forwarded-आद्य हैडर कि आप को पता है लोड संतुलन से पहले इस्तेमाल किया प्रोटोकॉल (http या https) था क्या कैप्चर कर सकते हैं कहते हैं।

app.use(function(req, res, next) { 
    if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) { 
     res.redirect('https://' + req.get('Host') + req.url); 
    } 
    else 
     next(); 
}); 

आशा इस मदद:

तो यह छोटा सा संशोधन चाल किया!

+0

यह वही है जो मैं कर रहा था। – Greg

+0

धन्यवाद! मैं इस पर अपने बालों को खींच रहा था। –

+0

मैं इस समाधान का उपयोग कई छोटे एकल पेज ऐप्स के लिए कर रहा था, लेकिन हाल ही में यह वास्तव में http को https को आगे बढ़ाने में विफल रहा; हमें इसके बजाय एडब्ल्यूएस के लिए एक nginx कॉन्फ़िगरेशन फ़ाइल अद्यतन करना था, और वहां अग्रेषण को संभालना था। इस कॉन्फ़िगरेशन को मिडलवेयर (ऊपर के रूप में) में सेट करने और इसे nginx या apache config में सेट करने के बीच क्या अंतर है? – ala8727

संबंधित मुद्दे