ณ วันนี้10 ตุลาคม 2014โดยใช้Heroku Cedar stackและ ExpressJS ~ 3.4.4นี่คือชุดโค้ดที่ใช้งานได้
สิ่งสำคัญที่ต้องจำไว้ที่นี่คือเรากำลังปรับใช้กับ Heroku การยุติ SSL เกิดขึ้นที่ตัวจัดสรรภาระงานก่อนที่การรับส่งข้อมูลที่เข้ารหัสจะไปถึงแอปโหนดของคุณ เป็นไปได้ที่จะทดสอบว่าใช้ https เพื่อสร้างคำขอด้วยreq.headers ['x-forwarded-proto'] === 'https'หรือไม่
เราไม่จำเป็นต้องกังวลเกี่ยวกับการมีใบรับรอง SSL ในเครื่องภายในแอป ฯลฯ เช่นเดียวกับที่คุณอาจโฮสต์ในสภาพแวดล้อมอื่น ๆ อย่างไรก็ตามคุณควรได้รับ SSL Add-On ที่ใช้ผ่าน Heroku Add-ons ก่อนหากใช้ใบรับรองของคุณเองโดเมนย่อยและอื่น ๆ
จากนั้นเพิ่มสิ่งต่อไปนี้เพื่อทำการเปลี่ยนเส้นทางจากสิ่งอื่นที่ไม่ใช่ HTTPS ไปยัง HTTPS นี่ใกล้เคียงกับคำตอบที่ยอมรับข้างต้นมาก แต่:
- ตรวจสอบให้แน่ใจว่าคุณใช้ "app.use" (สำหรับการกระทำทั้งหมดไม่ใช่แค่รับ)
- ภายนอกลอจิก forceSsl อย่างชัดเจนให้เป็นฟังก์ชันที่ประกาศ
- ไม่ได้ใช้ '*' กับ "app.use" - สิ่งนี้ล้มเหลวจริง ๆ เมื่อฉันทดสอบ
- ที่นี่ฉันต้องการ SSL ในการผลิตเท่านั้น (เปลี่ยนตามความต้องการของคุณ)
รหัส:
var express = require('express'),
env = process.env.NODE_ENV || 'development';
var forceSsl = function (req, res, next) {
if (req.headers['x-forwarded-proto'] !== 'https') {
return res.redirect(['https://', req.get('Host'), req.url].join(''));
}
return next();
};
app.configure(function () {
if (env === 'production') {
app.use(forceSsl);
}
// other configurations etc for express go here...
}
หมายเหตุสำหรับผู้ใช้ SailsJS (0.10.x) คุณสามารถสร้างนโยบาย (enforceSsl.js) ภายใน api / นโยบาย:
module.exports = function (req, res, next) {
'use strict';
if ((req.headers['x-forwarded-proto'] !== 'https') && (process.env.NODE_ENV === 'production')) {
return res.redirect([
'https://',
req.get('Host'),
req.url
].join(''));
} else {
next();
}
};
จากนั้นอ้างอิงจาก config / policy.js พร้อมกับนโยบายอื่น ๆ เช่น:
'*': ['authenticated', 'enforceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })