akiyoko blog

akiyoko の IT技術系ブログです

wwwありのドメインへのアクセスを wwwなしのドメインに 301リダイレクト転送する方法

1. はじめに

wwwなしのドメイン(いわゆる「ネイキッドドメイン」)を正規のURLとして、wwwありのドメインへのアクセスを wwwなしのドメインに 301リダイレクト転送したかったので、やり方を調べてみました。


そもそも何故、301リダイレクトで正規の URLに転送しなければならないかについては、以下の Google のヘルプに詳しく書かれています。


要するに、検索エンジンが wwwなしのドメインと wwwありのドメインの両方のコンテンツを重複してインデックスしてしまう(別々のコンテンツと見なされてしまう)ので、どちらかをもう一方へリダイレクトすることで回避しましょう、ということですね。


今回は Googleヘルプに書かれている施策の中で、

正規以外の URL には 301 リダイレクトを使用する


次のように、同じページに複数の方法でアクセスできるようになっている場合は、

https://example.com/home
https://home.example.com
https://www.example.com
URL の 1 つを優先的な(正規の)リンク先として設定し、301 リダイレクトを使用して、優先的に使用する URL に他の URL からのトラフィックを送信することをおすすめします。サーバー側での 301 リダイレクトは、ユーザーや検索エンジンを正しいページに確実に誘導するのに最善の方法です。ステータス コード 301 は、ページが別の場所に完全に移転したことを意味します。

について、具体的な手法を考えてみることにします。


  

2. やりたいこと

実現したいのは、

  • wwwありドメインへのアクセス ⇒ wwwなしドメインへのアクセス

という 301リダイレクト転送です。


ついでに、

  • http へのアクセス ⇒ https へのアクセス
  • IPアドレスへのアクセス ⇒ wwwなしドメインへのアクセス

という転送についても、合わせ技で実現してしまいます。


具体的には、

といった URL転送をさせます。



 

3. 結論(Nginx の設定で転送)

結論としては、Nginx の設定で転送するようにしました。


なお、「Google Apps使いこなしメモ&クラウド情報: Google Sitesにwwwなしのドメインを割り当てたい」で言及されている「お名前.com URL転送Plus」を使ったやり方では、やりたいことが実現できませんでした。詳しくは後述。


以下、手順です。

 

3.1. SSLサーバ証明書、インスタンス、Webアプリ、Nginx の準備

SSLサーバ証明書の入手、Ubuntuサーバ(Amazon EC2インスタンス)の起動、Webアプリケーション(Django)、およびリバースプロキシ(Nginx)のインストールについては、以下の過去記事を参照。


なお、今回は検証目的なので、SSLサーバ証明書は自己署名証明書でも構いません。その場合は、以下を参照してください。



 

3.2. レジストラ側で Aレコードを設定

レジストラの Aレコード設定は、「wwwありのドメイン」と「wwwなしのドメイン」の両方を同じIPに振り向けます。





例えば、お名前.com の場合では、ドメインNavi にログインし、「ドメイン設定」->「DNS関連機能の設定」から、以下の 2つの Aレコードを設定して保存します。

ホスト名 TYPE TTL VALUE
www.akiyoko.com A 3600(デフォルトのまま) 52.68.xxx.xxx(サーバのIPアドレス)
akiyoko.com A 3600(デフォルトのまま) 52.68.xxx.xxx(サーバのIPアドレス)


f:id:akiyoko:20150731023025p:plain
f:id:akiyoko:20150731023039p:plain
f:id:akiyoko:20150731023052p:plain
f:id:akiyoko:20150731023103p:plain



 

3.3. Nginx の設定ファイル書き換え

Nginx の設定ファイルを以下の通りに書き換えます。

$ sudo vi /etc/nginx/sites-available/default
---
upstream myproject_upstream {
    server unix:/tmp/myproject.sock fail_timeout=0;
}

server {
    listen 443 ssl;
    server_name akiyoko.com;
    ssl_certificate /etc/nginx/ssl/www_akiyoko_com.crt;
    ssl_certificate_key /etc/nginx/ssl/www_akiyoko_com.key;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /opt/webapps/myproject;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://myproject_upstream;
    }
}

server {
    listen 80;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /etc/nginx/ssl/www_akiyoko_com.crt;
    ssl_certificate_key /etc/nginx/ssl/www_akiyoko_com.key;
    return 301 https://akiyoko.com$request_uri;
}
---

$ sudo service nginx reload


ちょっとややこしいのですが、一番下の server ブロックがポイントで、正規のURL以外へのアクセスを「return 301」を使って 301リダイレクト転送させています。


「rewrite」モジュールを使っても 301リダイレクト転送ができるのですが、

といった理由から、ここでは「return 301」を使うことにしました。





ちなみに、SSLを利用しない場合は、以下のようになります。

sudo vi /etc/nginx/sites-available/default
---
upstream myproject_upstream {
    server unix:/tmp/myproject.sock fail_timeout=0;
}

server {
    listen 80;
    server_name akiyoko.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /opt/webapps/myproject;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://myproject_upstream;
    }
}

server {
    listen 80 default_server;
    server_name _;
    return 301 http://akiyoko.com$request_uri;
}
---


 

4. 失敗例(お名前.com URL転送Plus で転送)

  • wwwありドメインへのアクセス ⇒ wwwなしドメインへのアクセス

という 301リダイレクト転送について、お名前.com の「Aレコード設定」と「お名前.com URL転送Plus」の組み合わせで実現できればと思ってやってみたのですが、結局うまく実現させることができませんでした。


お名前.com 転送Plus については、以下に詳しい説明があります。
URL転送Plus|ドメイン取るならお名前.com



URL転送設定の手順は非常に簡単です。

 

4.1. wwwなしのドメインの Aレコードを設定

まず、DNS の Aレコードは以下のように設定しておきます。

ホスト名 TYPE TTL VALUE
akiyoko.com A 3600(デフォルトのまま) 52.68.xxx.xxx(サーバのIPアドレス)


f:id:akiyoko:20150801145755p:plain

 

4.2. お名前.com URL転送Plus を設定

「オプション設定」->「URL転送設定」から、「wwwありドメイン ⇒ wwwなしドメイン」の転送設定をします。

転送元URL 転送先URL 転送タイプ
http://www.akiyoko.com/ http://akiyoko.com/ リダイレクト


f:id:akiyoko:20150801145309p:plain


4.3. 結果

に転送できたのですが、いくつか問題点が。


1)
http://www.akiyoko.com/admin/ など、指定した転送元URL以外へのアクセスが転送されないことから、どうやら、「お名前.com URL転送Plus」は「転送元URL」から「転送先URL」への 1対1 の転送を行うだけで、ディレクトリやファイルまでは転送先URL に引き継いでくれないようです。

すなわち、

という転送ができないのです。

f:id:akiyoko:20150801151110p:plain


2)
「お名前.com URL転送Plus」では、301リダイレクト ではなく 302リダイレクトになってしまうようです。Googleヘルプでは 301リダイレクトを推奨しているので、サイト全体に適用する恒久的な転送では、やはり301リダイレクトの方がよいように思われます。



 

5. まとめ

Nginx はきめ細かい設定ができるので、まさに何でもできちゃうという感じですね。
逆に、レジストラ側で何でもやろうとすると限界があるので、あまり細かいことはさせず、Aレコードや CNAME の設定だけにとどめるのがよいように思いました。