ykzts.blog

nginx の設定ファイルで正規表現を使って www. なしのドメイン名にリダイレクトさせる

一つのサーバーに複数のドメイン名のウェブページを同居させることはよくある話だと思います。負荷のことを思えばドメイン名単位でサーバーを分けたほうが良いのでしょうが、さしたアクセスが見込めないウェブページを集約しても問題は起きないでしょう。

ただ www. つきでアクセスされた際に、www. なしのドメイン名へのリダイレクトをさせる処理をドメイン名単位で一つ一つ書いていくのは無駄です。

nginx の server_name ディレクティブでは正規表現を使えます。nginx が正規表現エンジンとして使っている PCRE では名前付きキャプチャに対応しているので次のように書けます。

server {
  listen 80;
  server_name "~^www\.(?<naked_domain>.*)$";

  set $proto $scheme;

  if ($http_x_forwarded_proto = "https") {
    set $proto $http_x_forwarded_proto;
  }

  if ($http_cloudfront_forwarded_proto = "https") {
    set $proto $http_cloudfront_forwarded_proto;
  }

  rewrite . $proto://$naked_domain$uri permanent;
}

上位に CloudFront や CloudFlare といった CDN が存在しない場合は、$proto 周りの小細工が不要になり、もう少し単純になります。nginx の設定ファイルは簡単に書けて良いですね。

正規表現を使うと処理が一回の接続ごとに実行される処理が増えます。そのため速度の面を考えると使わないほうが安心ではあります。ですがそこまで気にする必要がないような場合は、nginx.conf の記述を簡略化できるので便利です。

ぜひご活用くださいませ。