【簡単設定】nginxで特定のURLへのアクセスをhttpsリダイレクトする方法

    今回はnginxでrewriteを使わずに、特定ページへのアクセスのみhttpsにリダイレクトする方法を書きたいと思います。

    “webサイト全体をhttps化(常時SSL)したいわけではないけど、ログイン用ページなどのクレデンシャルな情報を取り扱うページだけはhttpsにしたい・・・。”

    そういった場合に、「nginx https リダイレクト」とか検索しても、出てくるのは全体のhttps化ばっかり。もしくは、特定ページのみのリダイレクトだけど、なんか設定が煩雑で分かりにくい。

    私がこれを実装しようとした時に上記の問題にぶつかったので、メモも兼ねて残しておこうと思います。

    スポンサーリンク

    事前準備

    • ドメインを取得している(共有ドメインでもok)
    • SSL証明書を取得し、nginxのSSL関連の設定が完了している(自サイトへhttpsプロトコルで繋がる)

    以上が完了しているものとします。

    ドメインは持ってるけどSSL証明書がない場合は、Let’s Encryptを使えば無料で証明書を取得できます。無料で取得できるなんてとてもいい時代です。

    ただし2016/9/23現在、Let’s Encryptは日本語ドメインには対応していませんのでご注意を。なので日本語ドメインで使うならば、リスクを承知の上でオレオレ認証局を立てるか、格安で発行できるRapid-SSLをオススメします。

    Rapid-SSLは世界シェア2位の認証局であるジオトラストが発行している信頼性もあり、最近はOV-SSL・EV-SSLほどのセキュアな証明書を求めない企業で導入が進んでいます。

    nginxでリダイレクトを設定する

    nginxをyumでインストールした場合、

    デフォルトの設定ファイルは「/etc/nginx/conf.d/default.conf」になります。

    default.confを編集する前に、まずはバックアップを取りましょう。

    その後、viエディタなどで「/etc/nginx/conf.d/default.conf」を開きましょう。

    そして「server {}」の中に、おもむろに以下の4行を追記しましょう。

    これは「http://あなたのドメイン/hogehoge.php」というリクエストが来たら(4行目)、

    301リダイレクトで「https://あなたのドメイン/hogehoge.php」を返しますよー(5行目)

    という内容になっています。

    なのでもしリダイレクトさせたいページが

    「http://あなたのドメイン/hoge/hogehoge.html」なら、

    上記のように書けばそのページが強制的にhttps接続になります。

    追記が終わった後は「nginx -s reload」しましょう。

    nginxはapacheと違い、設定ファイルの反映にプロセスリスタートを必要としませんので、上記のコマンドを叩いた時点で設定が反映されます。

    また、「/etc/nginx/conf.d」の中にいくつもの設定ファイルがある場合、バーチャルサーバ毎に設定が分けられている可能性がありますので、対象の設定ファイルを判断した上で作業を行ってください。

    でないと同じサーバ上で動作している別のサイトにも影響を与えかねないので・・・。

    心配な人は「/etc/nginx/nginx.conf」を覗いて、他にincludeしているものがないか確認しましょう。

    以上で設定は終わりです。apacheもそうですが、rewrite文は正規表現が入るのでとても分かりにくいんですよね。このあたりはもっと勉強しなければ。

    これからもエンジニア向けに役立つ記事を書いていきます。

    この記事の内容はCentOS 7.2/nginx 1.11.4という環境でテストしています。

    スポンサーリンク