1. ホーム
  2. node.js

[解決済み】node.js/expressでHTTPSの自動接続/リダイレクトを行う。

2022-04-07 09:51:21

質問

私が取り組んでいるnode.jsのプロジェクトでHTTPSをセットアップしようとしています。 私は基本的に 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にしたいのです。

どうすれば、node(および使用しているフレームワークである Express)は、指定されているかどうかにかかわらず、すべての受信トラフィックを https に渡すようになりますか? この問題に対処したドキュメントを見つけることができません。 それとも、本番環境では、node の前にこの種のリダイレクトを処理する何か(例えば nginx)があると想定しているのでしょうか?

これは私のWeb開発への最初の進出なので、これが明白な何かであれば、私の無知を許してください。

どのように解決するのですか?

Ryan、正しい方向性を示してくれてありがとう。 あなたの答え(2番目の段落)をいくつかのコードで少し肉付けして、それが動作するようにしました。 このシナリオでは、これらのコードスニペットは、私のexpressアプリに配置されています。

// set up plain http server
var http = express();

// set up a route to redirect http to https
http.get('*', function(req, res) {  
    res.redirect('https://' + req.headers.host + req.url);

    // Or, if you don't want to automatically detect the domain name from the request header, you can hard code it:
    // res.redirect('https://example.com' + req.url);
})

// have it listen on 8080
http.listen(8080);

https expressサーバはATMを3000でリッスンしています。 この iptables ルールは、ノードが root 権限で実行される必要がないように設定されています。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000

これで、思い通りに動作するようになりました。

HTTP経由のCookieの盗難を防ぐには この回答 (コメントより)またはこのコードを使用してください。

const session = require('cookie-session');
app.use(
  session({
    secret: "some secret",
    httpOnly: true,  // Don't let browser javascript access cookies.
    secure: true, // Only use cookies over https.
  })
);