Mulai hari ini, 10 Oktober 2014 , menggunakan tumpukan Heroku Cedar , dan ExpressJS ~ 3.4.4 , berikut adalah satu set kode yang berfungsi.
Hal utama yang perlu diingat di sini adalah bahwa kami SUDAH menerapkan ke Heroku. Penghentian SSL terjadi di penyeimbang beban, sebelum lalu lintas terenkripsi mencapai aplikasi node Anda. Anda dapat menguji apakah https digunakan untuk membuat permintaan dengan req.headers ['x-forwarded-proto'] === 'https' .
Kami tidak perlu khawatir dengan memiliki sertifikat SSL lokal di dalam aplikasi dll seperti yang mungkin Anda lakukan jika menghosting di lingkungan lain. Namun, Anda harus mendapatkan Add-On SSL yang diterapkan melalui Add-on Heroku terlebih dahulu jika menggunakan sertifikat, sub-domain Anda sendiri, dll.
Kemudian tambahkan yang berikut ini untuk melakukan pengalihan dari selain HTTPS ke HTTPS. Ini sangat dekat dengan jawaban yang diterima di atas, tetapi:
- Pastikan Anda menggunakan "app.use" (untuk semua tindakan, tidak hanya mendapatkan)
- Secara eksplisit mengeluarkan logika forceSsl ke dalam fungsi yang dideklarasikan
- Tidak menggunakan '*' dengan "app.use" - ini sebenarnya gagal saat saya mengujinya.
- Di sini, saya hanya ingin SSL dalam produksi. (Ubah sesuai kebutuhan Anda)
Kode:
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...
}
Catatan untuk pengguna SailsJS (0.10.x). Anda cukup membuat kebijakan (menegakkanSsl.js) di dalam api / kebijakan:
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();
}
};
Kemudian referensi dari config / policy.js bersama dengan kebijakan lainnya, misalnya:
'*': ['Authenticated', 'EnegceSsl']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })