ykzts.com

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 の記述を簡略化できるので便利です。

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

関連記事

nginxで任意のHTTPヘッダーを追加したい場合にはadd_headerディレクティブを用いますが、add_headerディレクティブは追加しようとしたフィールド名が重複するHTTPヘッダーが既に用意されていた場合には既にある物に「,」区切りで連結してしまいます。たとえば強制的に出力するContent-Typeを変更するためにadd_header Content-Type text/css;のようにしてもContent-Type: text/html, text/cssといった形の不正なHTTPヘッダーが出力されてしまいます。

ここ最近、俄かにSPDYが流行の兆しを見せているように見える。言及されぬ技術は使われず、そして使われぬ技術は存在しない物であるのと同義であると私は考えるので悪い事ではないのだが、本来SPDYを使う上で注意すべきである点を無視して言及しているように見えるので一度深く熟考する必要があるのではないだろうか。