2012-05-22 2 views
22

Я запускаю node.js express 3 сервера без прокси и используя SSL.Force SSL с expressjs 3

Я пытаюсь выяснить, как заставить все соединения проходить через https.

поиск Google показывает мне это:

https://groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY

Там в настоящее время нет способа заставить HTTPS перенаправляет, хотя это кажется как немного странно обходным. У нас есть протокол HTTPS-только приложение, и мы просто простой сервер HTTP ~ 4 линии узла, который перенаправляет, ничего фантазии

Что мне нужно, но он не говорит, что эти 4 линии.

Как мы это сделаем? Благодарю.

ответ

62

Я действительно не понимаю смысла в запуске двух серверов, когда только один может сделать работу в совершенстве. Например, путем добавления простого промежуточного программного файла сервера:

app.use(function(req, res, next) { 
    if(!req.secure) { 
    return res.redirect(['https://', req.get('Host'), req.url].join('')); 
    } 
    next(); 
}); 

Это будет перенаправлять любой незащищенный запрос на соответствующую страницу HTTPS. Например, http://example.com/ - https://example.com/ и http://example.com/foo?bar=woo - https://example.com/foo?bar=woo. Это определенно поведение, которого я ожидал бы. Возможно, вам следует отфильтровать это хостом, поэтому он перенаправляет только на домены, для которых вы владеете, и установил надлежащий сертификат.

Если ваше приложение работает за другим сервером, например Nginx, вы можете добавить параметр конфигурации app.set('trust proxy', true). Или, что еще лучше, сделайте Nginx самой переадресацией, которая будет более эффективной, чем любое приложение Node.js.

Edit: По моим тестам, join немного быстрее, чем + для конкатенации строк. Ничего страшного, но каждая победа - это победа ...

+2

Я попробовал, и вам кажется, что вам все равно нужно создать http-сервер, чтобы это работало, в основном 2 сервера. Это хорошо, и этот ответ работает. – Harry

+0

Правда. Я имел в виду два разных кода, извините за путаницу. Или, только одно приложение с некоторым прокси-сервером/балансиром нагрузки =) – Pierre

+0

@prx Редактирование, которое вы предложили, было отклонено, поскольку оно должно быть опубликовано как новый ответ, а не редактировать существующий ответ. –

0

Вы должны создать второй сервер прослушивает 80 и перенаправлять с 301 заголовка на ваш сервер HTTPS:

var express = require('express'); 
var app = express(); 

app.get('/', function(req, res, next){ 
    res.redirect('https://' + app.address().address) 
}); 

app.listen(80); 
+1

, которая перенаправляет весь трафик, даже существующие https-теги? – Harry

+2

Это может определенно работать, но этот подход не работает, если пользователь запрашивает другую страницу, которая «/». В этом случае он просто получит тревогу 404. – Pierre

Смежные вопросы