27

プロキシを使用せず、SSL を使用する node.js Express 3 サーバーを実行しています。

すべての接続を強制的に https 経由にする方法を見つけようとしています。

Google検索でこれが表示されます:

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

現在、https リダイレクトを強制する方法はありませんが、これは少し奇妙な回避策のように思えます。httpsのみのアプリがあり、リダイレクトする単純な〜4行ノードのhttpサーバーしかありません。

これは私が必要としているものですが、彼はそれらの 4 行が何であるかを述べていません。

どうやってこれを行うのですか?ありがとう。

4

3 に答える 3

84

1 つのサーバーしか完全に機能しない場合に、2 つのサーバーを起動する意味がよくわかりません。たとえば、サーバー ファイルに単純なミドルウェアを追加すると、次のようになります。

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

これにより、非セキュアなリクエストが対応する HTTPS ページにリダイレクトされます。たとえば、http://example.com/tohttps://example.com/http://example.com/foo?bar=wooto https://example.com/foo?bar=woo。これは間違いなく私が期待する動作です。これをホストでフィルタリングして、適切な証明書を所有してインストールしたドメインにのみリダイレクトする必要があるかもしれません。

アプリが Nginx などの別のサーバーの背後で実行されている場合は、構成パラメーターを追加することをお勧めしますapp.set('trust proxy', true)。または、さらに良いことに、Nginx 自体にリダイレクトを行わせます。これは、どの Node.js アプリよりも効率的です。

編集:私のベンチマークによると、文字列を連結joinするよりも少し高速です。+劇的なことは何もありませんが、すべての勝利は勝利です...

于 2012-05-23T08:01:39.913 に答える
0

80 でリッスンする 2 つ目のサーバーを作成し、301 ヘッダーで https サーバーにリダイレクトする必要があります。

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

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

app.listen(80);
于 2012-05-22T09:43:31.870 に答える