Я пытался настроить HTTPS с проектом node.js, над которым я работаю. Я, по сути, следовал документации для node.js для этого примера:
// curl -k https://localhost:8000/
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
Теперь, когда я делаю
curl -k https://localhost:8000/
я получил
hello world
как и ожидалось. Но если я сделаю
curl -k http://localhost:8000/
я получил
curl: (52) Empty reply from server
В ретроспективе это кажется очевидным, что это будет работать таким образом, но в то же время люди, которые в конечном итоге посещают мой проект, не собираются вводить https : // yadayada, и я хочу, чтобы весь трафик был https с момента их попадания сайт.
Как я могу получить узел (и Express, поскольку это среда, которую я использую), чтобы передать весь входящий трафик на https, независимо от того, был ли он указан? Я не смог найти никаких документов, которые касались этого. Или просто предполагается, что в производственной среде узел имеет что-то, что находится перед ним (например, nginx), который обрабатывает такой тип перенаправления?
Это мой первый опыт веб-разработки, поэтому, пожалуйста, прости мое невежество, если это что-то очевидно.
Ответы:
Райан, спасибо, что указал мне правильное направление. Я немного уточнил ваш ответ (2-й абзац) с помощью некоторого кода, и он работает. В этом сценарии эти фрагменты кода помещаются в мое экспресс-приложение:
Экспресс-сервер https прослушивает ATM на 3000. Я установил эти правила iptables, чтобы узел не запускался от имени пользователя root:
Все вместе, это работает именно так, как я хотел.
источник
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects
if(!req.secure){}
if(req.protocol==='http')
заявлениеЕсли вы используете обычные порты, так как HTTP пытается использовать порт 80 по умолчанию, а HTTPS пытается использовать порт 443 по умолчанию, вы можете просто иметь два сервера на одной машине: Вот код:
Тест с https:
С http:
Более подробная информация: Nodejs HTTP и HTTPS через один и тот же порт
источник
res.writeHead(301, etc.)
будет правильно работать только для вызовов GET, поскольку301
не говорит клиенту использовать тот же метод. Если вы хотите сохранить используемый метод (и все остальные параметры), вы должны использоватьres.writeHead(307, etc.)
. И если это все еще не работает, вам может понадобиться прокси. Источник: http://stackoverflow.com/a/17612942/1876359Спасибо этому парню: https://www.tonyerwin.com/2014/09/redirecting-http-to-https-with-nodejs.html
источник
app.enable('trust proxy');
app.get('X-Forwarded-Proto') != 'http'
вместоreq.secure
aws.amazon.com/premiumsupport/knowledge-center/...С Nginx вы можете воспользоваться заголовком «x-forwarded-proto»:
источник
app.enable('trust proxy');
: «Указывает, что приложение находится за фронтальным прокси-сервером и использовать заголовки X-Forwarded- * для определения соединения и IP-адреса клиента». expressjs.com/en/4x/api.html#app.setНачиная с 0.4.12, у нас нет реального чистого способа прослушивания HTTP и HTTPS на одном и том же порту с использованием HTTP / HTTPS-серверов Node.
Некоторые люди решили эту проблему с помощью HTTPS-сервера Node (который также работает с Express.js), который прослушивает 443 (или какой-либо другой порт), а также имеет небольшой http-сервер, привязанный к 80 и перенаправляющий пользователей на защищенный порт.
Если вам абсолютно необходимо иметь возможность обрабатывать оба протокола на одном порту, вам нужно установить на этот порт nginx, lighttpd, apache или какой-либо другой веб-сервер и действовать как обратный прокси-сервер для Node.
источник
Вы можете использовать модуль express-force-https :
npm install --save express-force-https
источник
app
первую очередь. (см. этот ответ )Я использую решение, предложенное Basarat, но мне также нужно перезаписать порт, потому что у меня было 2 разных порта для протоколов HTTP и HTTPS.
Я предпочитаю также использовать нестандартный порт, так что запускать nodejs без прав root. Мне нравятся 8080 и 8443, потому что я много лет программировал на tomcat.
Мой полный файл стал
Затем я использую iptable для переписывания трафика 80 и 443 через порты HTTP и HTTPS.
источник
Этот ответ необходимо обновить для работы с Express 4.0. Вот как я получил отдельный http-сервер для работы:
источник
Если ваше приложение находится за доверенным прокси-сервером (например, AWS ELB или правильно настроенным nginx), этот код должен работать:
Ноты:
источник
Я считаю, что req.protocol работает, когда я использую экспресс (не тестировал без, но я подозреваю, что он работает). используя текущий узел 0.10.22 с экспрессом 3.4.3
источник
Большинство ответов здесь предлагают использовать заголовок req.headers.host.
Заголовок Host требуется HTTP 1.1, но на самом деле он необязателен, поскольку заголовок может фактически не отправляться HTTP-клиентом, и узел / экспресс примет этот запрос.
Вы можете спросить: какой HTTP-клиент (например, браузер) может отправить запрос без этого заголовка? Протокол HTTP очень тривиален. Вы можете создать HTTP-запрос в несколько строк кода, чтобы не отправлять заголовок узла, и если каждый раз, когда вы получаете искаженный запрос, вы генерируете исключение, и в зависимости от того, как вы обрабатываете такие исключения, это может привести к отключению вашего сервера.
Поэтому всегда проверяйте все входные данные . Это не паранойя, я получил запросы без заголовка хоста в моем сервисе.
Кроме того, никогда не рассматривайте URL как строки . Используйте модуль url узла, чтобы изменить определенные части строки. Обработка URL-адресов как строк может быть использована многими способами. Не делай этого.
источник
Это то, что мы используем, и это прекрасно работает!
источник
Вы можете использовать модуль "net" для прослушивания HTTP и HTTPS на одном и том же порту
источник
Это сработало для меня:
источник
Вы можете создать 2 сервера Node.js - один для HTTP и HTTPS
Вы также можете определить функцию установки, которую будут выполнять оба сервера, чтобы вам не пришлось писать многократно дублированный код.
Вот как я это сделал: (используя restify.js, но должен работать для express.js или для самого узла)
http://qugstart.com/blog/node-js/node-js-restify-server-with-both-http-and-https/
источник
Это сработало для меня:
Рекомендуем добавить заголовки перед перенаправлением на https
Теперь, когда вы делаете:
Ты получаешь:
Я использую экспресс 4.17.1
источник