SPACEKEY

Technical Memorandum

node.jsでhttpで来たのをhttpsにリダイレクトする

December 6, 2013

準備中のサービスはhttpで作っていたのですが、やっぱり早いうちにhttpsにしておこうと思い、とりあえずRapidSSLで安いやつを導入してみました。

それに伴い、node.jsの方をhttpsモジュールを使ってlistenするように変更するわけですが、80番で待たないようにしてしまったら思わずhttpsのsをうち忘れたりしたときにページが出なくなりますね。 なので、httpでも待っておいてそっちできてしまったらhttpsにリダイレクトしてあげたらいいかと思って方法を探してみたら、

if (req.headers['x-forwarded-proto'] === 'https')
next();
else
redirectうんぬん

というのをいくつか見たので試してみたんですが、なんかhttpsでアクセスしてもリダイレクトループしてしまう。 調べてみたらx-forwarded-protoがundefinedで来てるんですよね……

Expressのリファレンスを見たら、req.protocolでhttpとかhttpsなどが返ってくるようなのでそれを見るようにしたらできました。 req.secureが「’https’ == req.protocol」と同価らしいのでそれで判断しても良いですね。

あと、なんか今ちょっと思いついたんですが、どうせこのサーバーはこのサービス用にしか使うつもりがないので、iptableで80に来たやつを443に無理から転送してしまうと言うのもありなのかな?(試してないですけど)。