Nginxでドメインの正規化をする

一般にWebサイトのドメイン名にはwwwというサブドメインが付与されています。が、最近は短いurlが好まれるのか、サブドメインなしのアドレスもあったりします。

加えてSSL/TLS認証のありなしでプロトコルがhttpであったりhttpsであったり。。。

ドメインの正規化

このサイトも都合4通りのアクセス方法が存在します。まぁhttp通信を切り捨てたり、wwwなしのドメインを無効化したりしてもいいんですが、せっかく来てくれるのにねぇ。。。

というわけですべてのアクセスを受け入れたいわけですが、そうすると同じページへのアクセスが分散してしまって勿体ないわけです。見かけ上のアクセス数が減っちゃう。

そこでhttps://www.junk-works.science以外のアクセスをすべてこれに転送することにします。サイト作成準備のところでやった正規化です。

nginxの設定

nginx.confのひな形を示します。

# junk-works.science; web site
##########################################
server {
    listen       80;
    server_name  .junk-works.science;
    return 301 https://www.junk-works.science$request_uri;
}
server {
    listen       443 ssl;
    server_name  junk-works.science;
    ssl_certificate         /usr/local/etc/ssl/www.junk-works.science.crt;
    ssl_certificate_key     /usr/local/etc/ssl/www.junk-works.science.key;
    return 301 https://www.junk-works.science$request_uri;
}
server {
    listen       443 ssl http2;
    server_name  www.junk-works.science;
    ssl_certificate         /usr/local/etc/ssl/www.junk-works.science.crt;
    ssl_certificate_key     /usr/local/etc/ssl/www.junk-works.science.key;
    ssl_dhparam dhparam.pem;
    ssl_ciphers ECDHE+AESGCM:DHE+AESGCM:HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";

    root   /usr/local/www/junkworks;
    index  index.php index.html index.htm;

    ~locationブロックは省略~

}

serverブロックは3つ。最後のものがhttps://www.junk-works.scienceを受けるものです。

最初のserverブロックはserver_nameを.junk-works.scienceと、ドットから始めることでwwwありのアクセスもwwwなしのアクセスも、ポート80に入ってくるものは一旦すべて受けます。2番目のserverブロックではポート443に入ってくるwwwなしのアクセスを一旦受けます。

そのうえでいずれのブロックもreturn行で301ステータスを返してから、アクセスを最後のserverブロックへリダイレクトします。

なお2番目のserverブロックについてはデフォルトサーバーの指定でもあったようにサーバー証明書の指定が必要です。