Kể từ hôm nay, ngày 10 tháng 10 năm 2014 , bằng cách sử dụng ngăn xếp Heroku Cedar và ExpressJS ~ 3.4.4 , đây là một bộ mã hoạt động.
Điều chính cần nhớ ở đây là chúng tôi đang triển khai cho Heroku. Việc chấm dứt SSL xảy ra ở bộ cân bằng tải, trước khi lưu lượng được mã hóa đến ứng dụng nút của bạn. Có thể kiểm tra xem https có được sử dụng để thực hiện yêu cầu với req.headers ['x-forwarded-proto'] === 'https' hay không .
Chúng tôi không cần quan tâm đến việc có chứng chỉ SSL cục bộ bên trong ứng dụng, v.v. như bạn có thể làm nếu lưu trữ trong các môi trường khác. Tuy nhiên, bạn nên áp dụng Tiện ích bổ sung SSL qua Tiện ích bổ sung Heroku trước nếu sử dụng chứng chỉ của riêng bạn, các miền phụ, v.v.
Sau đó, chỉ cần thêm phần sau để thực hiện chuyển hướng từ bất kỳ thứ gì khác ngoài HTTPS sang HTTPS. Điều này rất gần với câu trả lời được chấp nhận ở trên, nhưng:
- Đảm bảo bạn sử dụng "app.use" (cho tất cả các hành động, không chỉ nhận)
- Rõ ràng bên ngoài logic forceSsl thành một hàm đã khai báo
- Không sử dụng '*' với "app.use" - điều này thực sự không thành công khi tôi thử nghiệm.
- Ở đây, tôi chỉ muốn SSL trong sản xuất. (Thay đổi theo nhu cầu của bạn)
Mã:
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...
}
Lưu ý cho người dùng SailsJS (0.10.x). Bạn có thể chỉ cần tạo một chính sách (executeSsl.js) bên trong api / policy:
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();
}
};
Sau đó, tham chiếu từ config / policy.js cùng với bất kỳ chính sách nào khác, ví dụ:
'*': ['xác thực', 'cưỡng chế']
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })