Webサイトを公開するとき、慣習としてサブドメインにwwwを使用することがよくある。そのため、サブドメインなしのURLを正規とする場合、wwwありのURLからリダイレクトをするのが望ましい。Ghostをセルフホスティングする際、単一のFQDNに対してのみNginxやSSLの設定がされるため、自分で設定を追加する必要がある。この記事では、Ghostでこのようなリダイレクトをするための手順を紹介する。

www付きのURLも受け入れる必要性

古くから、wwwをサブドメインとして使用する文化がインターネットには存在する。現在は、www付きのURLか、なしのURLを正規として、どちらかにWebサイト側でリダイレクトをしてやるのが主流になっている。それがSEO的にも望ましいとされているし、Webサイトへ訪れるユーザーを少しでも損失しないためにも必要だ。実際、ブログ運営をしていると、ごく僅かではあるがwww付きのURLになぜかアクセスをしてきている人がいる形跡がある。

ghost-cliでは、一つのFQDNしかサポートされていない

Ghostをセルフホスティングする際、ghost-cliを用いてセットアップを行うことになる。このセットアップ時に、nginxの設定ファイルの作成や、指定したドメインに対するSSL証明書の発行などを自動で行なってくれる。しかし、ghost-cliでは、単一のFQDNに対してしかこれらの作業を行ってくれないため、www付きのURLからのリダイレクトを行いたい場合には、自分で追加の作業を行う必要がある。ちなみに、FQDN(Fully Qualified Domain Name)とは、サブドメインからトップレベルドメインまで含む完全なドメイン名のことだ。

wwwも受け付けるようにDNSレコードを追加する

まずは、wwwサブドメインを受け付けれるようにDNSレコードを追加する。以下は当ブログでの設定例だ。CNAMEで、HOSTをwww付きドメイン、ANSWERを通常のドメインとして指定する。

DNSレコードの設定例
DNSレコードの設定例

www付きドメインに対してSSLの設定を行う

ghost-cliでは、内部でacme.shというツールを用いてSSL証明書の発行と自動更新を行っている。自身で、直接acme.shを使用して証明書発行を行っても良いが、実はもっと楽な方法がある。それは、ghost-cliのconfigをwww付きドメインに変更して、SSL証明書を発行するというやり方だ。具体的に手順を見ていこう。

以降では例として以下のように環境変数が設定されているものとする。適宜自分の環境に合うように読み替えてほしい。

ROOT=/var/www/example
URL=https://example.com
WWW_URL=https://www.example.com

まず、以下のコマンドを順に実行することでSSL証明書の発行を行う。このとき、cronでSSL証明書を自動更新するための設定も追加してくれるので、期限が近づくたびに毎回実行をする必要はない。

# ghostのドキュメントルートに移動
$ cd $ROOT

# 一時的にurlを https://www.example.com に変更
$ ghost config url $WWW_URL

# ssl設定
$ ghost setup nginx ssl

# 元のurlに設定を戻す
$ ghost config url $URL

上記のコマンドでは、発行したSSL証明書を使用するようなnginxの設定ファイルも同時に作成されるが、今回はwwwなしのページへリダイレクトをするように修正をする必要がある。修正をする必要があるファイルは、http用とhttps用の2つだ。まずは、http用の以下のファイルを修正する。

$ vim /etc/nginx/sites-available/${WWW_URL}.conf
server {
    listen 80;
    listen [::]:80;

    server_name www.example.com;
    root /var/www/example/system/nginx-root;

    location / {
        return 301 https://example.com$request_uri;
    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

変更後のnginx設定ファイル例 (http用)

注意として、上記の内容のexample.comとされている箇所は適宜自分のドメインに書き換えて使用してほしい。また、/var/www/example となっているディレクトリ名も自身のghostプロジェクトのディレクトリに変更をしてほしい。それ以外の箇所はコピペで使用できる。重要なのは、locationディレクティブで301リダイレクトを行っている部分だ。この設定では、www.example.com へのhttpでの全てのアクセスをexample.com へリダイレクトしている。

次に、https用のファイルも変更する。

$ vim /etc/nginx/sites-available/www.nctn.me-ssl.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name www.example.com;
    root /var/www/example/system/nginx-root;

    ssl_certificate /etc/letsencrypt/www.example.com/fullchain.cer;
    ssl_certificate_key /etc/letsencrypt/www.example.com/www.example.com.key;
    include /etc/nginx/snippets/ssl-params.conf;

    location / {
        return 301 https://example.com$request_uri;
    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 1g;
}

変更後のnginx設定ファイル例 (https用)

こちらもやっていることはhttp用と変わらない。コピペする際はドメイン名などの値の変更し忘れにだけ注意してほしい。

最後にnginxのリロードとghostの再起動を行う。

$ sudo nginx -s reload
$ ghost restart

nginxのリロード時にエラーが出た場合は、何かしら設定ファイルの記述が間違っているので、自身で変更した箇所が正しいか再度確認してみてほしい。

ここまでの設定で、wwwありのURLからなしのURLへリダイレクトされるようになったはずだ。