我在node.js上使用express(3.0)框架来路由我的应用程序。
我的大多数应用程序都使用http
协议,但我只想通过https
提供一条特定的路由。这是我的API的一部分,负责注册和验证用户。
例如:
app.get('/connect', function(req, res){
// Must be on HTTPS, if not redirect to HTTPS
});
app.post('/connect', function(req, res){
// Must be on HTTPS
});
app.get('/', function(req, res){
// Must be on HTTP
});
app.get('/build', function(req, res){
// Must be on HTTP
});
如何在同一个应用程序中使用两者?我很难在野外找到任何这方面的例子。
答案 0 :(得分:10)
只需将app
(实际上是请求处理函数)传递给createServer
和http
的{{1}}。
https
HTTP和HTTPS请求都通过同一个Express应用程序进行路由。在路由处理程序中,要检查请求是否是通过https进行的,请使用var express = require('express')
, http = require('http')
, https = require('https')
, app = express();
http.createServer(app);
https.createServer({ ... }, app);
。
req.secure
作为旁注,现代智慧认为混合的http / https网站不安全。您可以通过要求他们通过SSL登录来保护用户的密码,但随后切换回http以用于后续请求会使攻击者trivial窃取用户的登录cookie。
考虑通过SSL登录用户发出所有请求。
答案 1 :(得分:1)
尝试这种方法。创建两个快速请求处理程序(app_http和app_https)。
在创建http服务器时将app_http作为请求处理程序传递(http.createServer(app_http))。
在创建https服务器时将app_https作为请求处理程序传递(https.createServer(options,app_https))。
var express = require('express'),
http = require('http'),
https = require('https');
var app_http = express(); // this one to handle http request
var app_https = express(); // this to handle httpS requests.
app_https.get('/connect', function(req, res){
// Must be on HTTPS, if not redirect to HTTPS
});
app_https.post('/connect', function(req, res){
// Must be on HTTPS
});
app_http.get('/', function(req, res){
// Must be on HTTP
});
app_http.get('/build', function(req, res){
// Must be on HTTP
});
//call here http.createServer & https.createServer with needed details.
答案 2 :(得分:1)
const express = require('express');
const app = express();
const fs = require('fs');
const options = {
key:fs.readFileSync('./ssl/privkey.pem'),
cert:fs.readFileSync('./ssl/allchange.pem')
};
const https = require('https').createServer(options,app);
const http = require('http').createServer(app);
app.get('/',(req,res) => {
(req.protocol == 'http') ? res.redirect('https://www.pkred.com/') : // code
// More code
// End code ;
}
app.get('/:id',(req,res) => {
(req.protocol == 'http') ? res.redirect(`https://www.pkred.com/${req.params.id}`) : // code
// More code
// End code ;
}
http.listen(8080,() => console.log('PORT :: 8080'));
https.listen(4433,() => console.log('PORT :: 4433'));