Могу ли я настроить expressjs для обслуживания одних страниц через http и других через https?
Основываясь на ответе на этот вопрос:
Как настроить nodejs/expressjs для обслуживания страниц через https?
Я пытался настроить эквивалент:
var express = require('express');
var fs = require("fs");
var crypto = require('crypto');
var app = express.createServer();
var appSecure = express.createServer();
var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();
var credentials = crypto.createCredentials({key: privateKey, cert: certificate});
appSecure.setSecure(credentials);
app.get('/secretStuff', function(req,res) {
//redirect to https
}
appSecure.get('/secretStuff', function(req, res) {
//show you the secret stuff
}
Это выполнимо с текущей версией expressjs и узла 2.4?
2 ответа
Да, это можно сделать, и, похоже, у вас уже есть большая часть того, что вам нужно. Просто отправьте редирект в ваш обработчик app.get
app.get('/secretStuff', function(req,res) {
res.redirect('https://' + req.header('Host') + req.url);
}
Также убедитесь, что вы делаете что-то вроде app.listen(80)
а также appSecure.listen(443)
фактически запустить серверы на соответствующем порту. В противном случае обязательно создайте URL-адрес HTTPS с правильным портом. Для производства эта вещь обычно обрабатывается за пределами вашего сервера приложений (node.js) с помощью обратного прокси-сервера, например nginx
, Это просто сделать в nginx, что позволит вашему процессу node.js запускаться без полномочий root и избавит от необходимости иметь клиентов, напрямую подключающихся к node.js, который не так закален, как nginx, для обслуживания подключенных в реальном времени TCP-соединений (Я перефразирую самого Райана Даля здесь).
Вы можете обслуживать веб-страницу только через соединение, на которое поступил запрос. Если запрос не поступил через https, вы не можете отправить ответ таким образом.
Итак, сначала вы должны прослушивать запросы http и https. Если запрос приходит через http, на который вы хотите ответить через безопасное соединение, не выполняйте никакой обработки, а немедленно перенаправьте его на URL-адрес https. Затем, когда клиент перезапустит запрос, обработайте как обычно.
Если фреймворк использует JSGI, то вы, вероятно, можете использовать модуль перенаправления от Джека, иначе вам придется сделать это самостоятельно. Подробности находятся по ссылке, т.е. код ответа 301 и заголовок Location: с URL-адресом https.