2012-11-01 11 views
7

मैं एक ऐप्स जो काफी सामान्य एक्सप्रेस ऐप्लिकेशन है। मुझे कई AJAX अनुरोध करना है। उनमें से कुछ को HTTPS प्रोटोकॉल द्वारा सुरक्षित किया जाना चाहिए (कुछ की आवश्यकता नहीं है)।Node.js, एक्सप्रेस और Heroku - कैसे HTTP और HTTPS को संभालने के लिए? सरल सर्वर तर्क, विचार, क्लाइंट साइड जे एस के बहुत सारे -

तो, अपने सर्वर दोनों HTTP और HTTPS के साथ काम करना चाहिए। यह भी ओ दोनों को स्थानीय मशीन (सामान्य रूप से nodemon साथ भाग गया) और Heroku पर काम करना चाहिए।

जहां तक ​​मैं समझ गया, Heroku आप एक ही बंदरगाह (process.env.PORT) आप सुन सकते हैं देता है, और प्रॉक्सी के माध्यम से सभी अनुरोधों को हैंडल (हां, तो आप एप्लिकेशन को इस बंदरगाह के लिए सुन रहा है और के बारे में परेशान नहीं आद्य - दाएं)

तो, मैं यह सही हो रही है - मैं देव मशीन और Heroku के लिए कुछ अलग कोड होना चाहिए?

तरह

... 
app = express() 
... 

if process.env.NODE_ENV == 'production' 
    app.listen(process.env.PORT) 
else 
    https = require('https') 
    http = require('http') 
    http.createServer(app).listen(5080) # some local port 
    options = { 
    key: fs.readFileSync('key.pem'), 
    cert: fs.readFileSync('cert.pem') # my self-signed files 
    } 
    https.createServer(options, app).listen(5443) # some different local port 

यह इस से निपटने के लिए उचित तरीका है?

उत्तर

8

खैर, समुदाय काफी मृत इन दिनों लग रहा है (आशा है कि मैं गलत हूँ)

जवाब है:

क) हाँ, इस के साथ यह

ख निपटने के लिए तरीका है) यदि आप सुरक्षित मोड में नहीं हैं या जाँच करने के लिए जिस तरह से पर्यावरण पर निर्भर करता है के रूप में अच्छी तरह से:

if process.env.NODE_ENV == 'production' 
    is_secure = (req) -> 
    req.headers['x-forwarded-proto'] == 'https' 
else 
    is_secure = (req) -> req.secure 

जोड़ें आप HTTPS को बलपूर्वक लागू करना चाहते हैं:

redirect_to_https = (req, res, next) -> 
    if not is_secure(req) 
    res.redirect config.SECURE_DOMAIN + req.url 
    else 
    next() 

app 
    .use(redirect_to_https) 
+0

एक त्वरित सवाल है कि हम इस' वापसी res.redirect तरह मेजबान मिल सकता है? –

+0

शायद हाँ, लेकिन क्या के लिए - बस अतिरेक समाप्त करने के लिए? आप ब्राउज़र से शीर्षलेख प्राप्त करते हैं। विन्यास (या env चर) से महत्वपूर्ण मूल्यों हो रही एक्सप्रेस 4 'app.set में मुझे – Guard

10

Coffeescript-चुनौतियों के लिए, यहाँ गार्ड के जवाब जावास्क्रिप्ट करने के लिए परिवर्तित का एक संस्करण है। मैंने अन्य बयानों को विभाजित करने के लिए एक अलग दृष्टिकोण लिया।

var express = require('express'); 
var http = require('http'); 
var https = require('https'); 
var fs = require('fs'); 
var privateKey = fs.readFileSync('./config/localhost.key').toString(); 
var certificate = fs.readFileSync('./config/localhost.crt').toString(); 

var options = { 
    key : privateKey 
, cert : certificate 
} 

var app = express(); 

// Start server. 
var port = process.env.PORT || 3000; // Used by Heroku and http on localhost 
process.env['PORT'] = process.env.PORT || 4000; // Used by https on localhost 

http.createServer(app).listen(port, function() { 
    console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env); 
}); 

// Run separate https server if on localhost 
if (process.env.NODE_ENV != 'production') { 
    https.createServer(options, app).listen(process.env.PORT, function() { 
     console.log("Express server listening with https on port %d in %s mode", this.address().port, app.settings.env); 
    }); 
}; 

if (process.env.NODE_ENV == 'production') { 
    app.use(function (req, res, next) { 
     res.setHeader('Strict-Transport-Security', 'max-age=8640000; includeSubDomains'); 
     if (req.headers['x-forwarded-proto'] && req.headers['x-forwarded-proto'] === "http") { 
      return res.redirect(301, 'https://' + req.host + req.url); 
     } else { 
      return next(); 
      } 
    }); 
} else { 
    app.use(function (req, res, next) { 
     res.setHeader('Strict-Transport-Security', 'max-age=8640000; includeSubDomains'); 
     if (!req.secure) { 
      return res.redirect(301, 'https://' + req.host + ":" + process.env.PORT + req.url); 
     } else { 
      return next(); 
      } 
    }); 

}; 
3

फिर आप app.enable('trust proxy') उपयोग कर सकते हैं, req.secure बूलियन (HTTP/HTTPS) Heroku पर भी काम करता है, या किसी भी संगत एसएसएल समाप्ति प्रॉक्सी के पीछे। विन्यास `से बजाय;: (+ req.headers.host + req.url 'https: //') -

+1

करने के लिए एक और अधिक विश्वसनीय विकल्प (के विश्वास प्रॉक्सी ',' लूपबैक ') की तरह दिखता है,' इस्तेमाल किया जा सकता। http://expressjs.com/4x/api.html#app-settings पर और विवरण देखें –