9

我正在使用 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
});

如何促进在同一应用程序中同时使用两者?我正在努力在野外找到任何这样的例子。

4

3 回答 3

10

只需将您的app(这实际上是一个请求处理程序函数)传递给createServerofhttphttps

var express = require('express')
    , http = require('http')
    , https = require('https')
    , app = express();

http.createServer(app);
https.createServer({ ... }, app);

HTTP 和 HTTPS 请求都通过同一个 Express 应用程序进行路由。在路由处理程序中,要检查是否通过 https 发出请求,请使用req.secure.

app.get('/route', function(req, res) {
    if (req.secure) {
        ...
    } else {
        res.redirect(301, 'https://example.com/route');
    }
});

作为旁注,现代智慧认为混合 http/https 站点是不安全的。您可以通过要求用户通过 SSL 登录来保护用户的密码,但随后切换回 http 进行后续请求会使攻击者窃取用户的登录 cookie变得微不足道。

考虑由登录用户通过 SSL发出所有请求。

于 2013-08-15T15:06:57.307 回答
1

试试这个方法。创建两个快速请求处理程序(app_http 和 app_https)。

在创建 http 服务器(http.createServer(app_http))时将 app_http 作为请求处理程序传递。

在创建 https 服务器 (https.createServer(options,app_https)) 时将 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.
于 2013-08-15T14:39:42.430 回答
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'));
于 2017-06-19T09:41:30.513 回答