config 301 redirect in nginx

Nginxにリダイレクトを設定してURLのwwwあり・なしを正規化

ウェブサイトのURLをwwwありwwwなしのどちらにしても構いませんが、どちらか1つにすべてのアクセスを統一したほうがSEOに有利です。 この記事ではNginxのリダイレクト機能を利用して、wwwのありなし及びhttp/httpsを1つのURLに正規化する方法を紹介します。

Nginx設定ファイルにあるserver block

NginxのコンフィグファイルではこのようなコードでHTTPサーバーを定義します。

server {
    listen 80 default_server;
    server_name example.com;
    ...
}

これは1つのサーバーブロックと言い、個別のドメインに対する設定はほとんどのこのブロック内で行います。

HTTPをHTTPSにリダイレクト

以前のLNMP環境セットアップの記事では、デフォルトのサーバーブロックを改造して、example.comドメインの80ポートに応答するサーバーを実装しました。つまりhttp://example.comがアクセスできるようになりました。

関連記事

ウェブサーバーの定番環境 LNMP,すなわちLinux + Nginx + MySQL + PHPは動的サイトを作るときによく使われるソフトウェア環境のセットです。LEMPと呼ばれる場合もあります。 The E in LEMP comes […]

LNMP

その次の記事で、certbotを利用してHTTPS対応を導入したため、HTTPS用の443ポートを応答するサーバーブロックが追加されます。

関連記事

安全なHTTP:HTTP Secure HTTPSはSSL/TLSを用いてHTTPデータを暗号化したプロトコルです。デフォルトポートは443。 HTTPSはインタネット通信の内容を暗号化して、パスワードやカード情報といった機密情報を漏洩を防[…]

無料SSL証明書を利用して簡単な設定で自動的にサイトをHTTPS化
server {
    server_name example.com;
    ...
    listen 443 default_server;
    ...
}

これでhttps://example.com もアクセスできるようになりました。 ただし、これだとhttpとhttps両方がアクセス出来てしまいますが、Googleが完全HTTPSかすることを推奨しているので、HTTPでのアクセスもHTTPSに「誘導」できた方が望ましい。 その「誘導」の設定はリダイレクトと言います。

Certbotを利用してHTTPSを導入するとき、HTTPをHTTPSにリダイレクトするかと聞かれますので、その場でリダイレクトすると選択すれば勝手に以下のリダイレクトコードが追加されます。(しなかった場合は手動で追加しても問題ありません。)

server {
    listen 80 default_server;
    server_name example.com;
    ...
    location / {
      # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
      return 301 https://$host$request_uri;
    }
}

要はHTTPの80ポートからのアクセスをhttps付きのバージョンに書き換えて、301コードと共にクライアントのブラウザーに送信します。 301は「永久的に新しいURLに移動した」という意味ですので、クライアントのブラウザーは301で返してきた新しいHTTPSのURLにアクセスし直します。

wwwありのURLをwwwなしにリダイレクト

HTTPをHTTPSにリダイレクトすると同じように、wwwありのURLを受け付けるサーバーブロックを作成して、301リダイレクトを利用してwwwなしのURLにリダイレクトします。

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

逆に全部wwwありの方にリダイレクトする方法も同じです。

二つのリダイレクトは併用できますので、例えばhttp://www.example.comでアクセスした場合、まずはhttp://example.comにリダイレクトして、あとはさらにhttps://example.comにリダイレクトすることになります。

リダイレクト以前、まずwww付きのURLでアクセスできるようにwwwのCNAMEレコードをDNSに追加する必要がありますので、ご注意ください。

関連記事

この記事ではCloudflareの無料CDNプランを利用してサイトのセキュリティと表示速度を改善する方法を紹介します。 CDNとは CDN(コンテンツ配信ネットワーク)は、分散Webコンテンツプロキシサービスです。 CDNサービスの提供者[…]

CDN content delivery network

リダイレクトせずに、wwwありとwwwなしのURLを同時にサポートします

リダイレクトせずにwwwありとなしを同時に使うことも可能です。もし両方が同じサイトにしたい場合は1つのサーバーブロックに併記します。

server {
    ...
    server_name example.com www.example.com
    ...
}

別々のサイトにすることも一応可能です。

server {
    ...
    server_name example.com

    # Site A
    ...
}

server {
    ...
    server_name www.example.com

    # Site B
    ...
}

ただし、wwwありなしを同時にサポートすると、サーチエンジンに2つの内容の同じサイトだと認識される可能性がありますので、SEOの面では不利ですし、ユーザーにとっても統一感がなく、覚えにくいサイトになりかねないので、お勧めできません。

wwwありとなしを別々のサイトにすることも可能ですが、wwwがただ習慣上インタネットに公開するサイトのURLにつくものだけで、それでサイトを区別するのはよろしくありません。別々のサブドメインでサイトを運用したいならそのサイトの趣旨に合わせて、blog.example.com, shop.example.comのようなサブドメインが望ましい。