CentOS 7でNginxを使用してwwwからNon-wwwにリダイレクトする方法。
はじめに
多くのウェブ開発者は、ユーザーがwwwサブドメインとルート(非www)ドメインの両方を介してウェブサイトやアプリケーションにアクセスできるようにする必要があります。つまり、www.my-website.comとmy-website.comを訪れた際にユーザーが同じ体験を得ることができるようにする必要があります。これを実現する方法はいくつかありますが、最もSEOに優れた解決策は、好みのドメイン(サブドメインまたはルートドメイン)を選び、もう一方のドメインを訪れたユーザーを好みのドメインにリダイレクトさせることです。
日本語で以下を表現すると、一つのオプションが必要です:
HTTPリダイレクトには多くの種類がありますが、このシナリオでは、301リダイレクトを使用するのが最適です。これはクライアントに「要求されたウェブサイトは別のURLに永久的に移動しました。そちらにアクセスしてください。」と伝えます。ブラウザはサーバーからHTTP 301レスポンスコードを受け取ると、新しいURLへの2つ目のリクエストを送信し、ユーザーはウェブサイトを表示されますが、おそらくリダイレクトされたことには気づかないでしょう。
両方のドメイン名に対して同じウェブサイトを提供するように、ウェブサーバーの設定を変更してみてはどうでしょうか?それは簡単に思えるかもしれませんが、301リダイレクトのSEOの利点は得られません。永続的なリダイレクトは、検索エンジンのクローラーに対してウェブサイトの唯一の正規の場所があることを伝え、そのURLの検索順位を向上させます。
このチュートリアルでは、CentOS 7でNginxを使用して301リダイレクトを設定します。もしNginxの代わりにApacheを使用している場合は、以下のチュートリアルをご覧ください: CentOS 7でApacheを使用してwwwから非wwwにリダイレクトする方法。
必要条件 (Hitsuyō jōken)
このチュートリアルを完了するためには、最初に以下が必要です :
- Superuser privileges (a user in the wheel group) on the server that is running Nginx. If you don’t already have that set up, follow this tutorial: Initial Server Setup with CentOS 7.
- Nginx installed and configured to serve your website. Follow this tutorial to do that: How to Install Nginx on CentOS 7.
- A registered domain name. If you don’t have one yet, you can get a free one from Freenom. You may use whatever DNS provider you like (including your registrar) to host your domain’s records—just make sure to point your registrar to your provider’s nameservers. If you opt to use Silicon Cloud DNS, this article from our documentation shows how to do that.
DNSレコードの設定から始めましょう。
ステップ1 — DNSレコードの設定
最初に、www.my-website.comとmy-website.comの両方をあなたのNginxサーバーに向ける必要があります。 (以下のチュートリアルの残り部分では、ドメインがmy-website.comであることを前提としています。以下に表示される場所では、自分のドメインに置き換えてください。) これは、それぞれの名前に対してNginxサーバーのIPアドレスを指すDNS Aレコードを作成することで実現します。
DNSプロバイダのウェブコンソールを開いてください。このチュートリアルでは、Silicon Cloud DNSを使用します。
「ドメイン追加」のフォームに、登録済みのドメイン名をテキストフィールドに入力し、「ドメインを追加」をクリックしてください。これにより、新しいドメインのページが表示されます。ここでは、ドメインのレコードを表示・追加・削除することができます。
新しいレコードを作成するには、HOSTNAMEテキストフィールドに「@」と入力します。これは、ルートドメイン名であるmy-website.com用のレコードを追加していることを示す特殊文字です。WILL DIRECT TOテキストフィールドには、サーバーの公開IPv4アドレスを入力し、Create Recordをクリックします。(TTLを変更する必要はありません。)
第二のDNSレコードでは、Aレコードの代わりにCNAMEレコードを使用することができます。CNAMEレコードはIPアドレスの代わりに別の名前を指すエイリアスです。www.my-website.comをmy-website.comに向けるCNAMEを作成することができ、wwwサブドメインへのHTTPリクエストは、ルートドメインのAレコードを作成したため、サーバーに届きます。ただし、簡単にするために、最初のAレコードと同様にもう1つのAレコードを作成し、「HOSTNAME」フィールドに「www」を入力し、「WILL DIRECT TO」フィールドにサーバーのパブリックIPアドレスを入力してください。
両方のレコードを作成したら、こんな感じになるはずです。
2つのレコードが設定されているので、my-website.comとwww.my-website.comのウェブリクエストは、あなたのNginxサーバーに到達するようになります。さて、サーバーの設定を行いましょう。
ステップ2 — Nginxでのリダイレクトの設定を行う。
前提条件に述べられている通り、あなたは既にNginxでウェブサイトを設定している必要があります。サイトのサーバーブロックがmainの/etc/nginx/nginx.confファイルにあるか独自のファイルにあるかは問題ではありません。重要なのは、server_nameディレクティブがmy-website.comおよび/またはwww.my-website.comに設定されたサーバーブロックが構成されていることです。server_nameに1つまたは両方の名前が含まれているかどうかは問題ありませんが、サイトをホストする唯一の名前としてどちらを選びたいかを決める時です。
お使いのウェブサイトの設定が含まれているファイル(例:/etc/nginx/conf.d/my-website.com.conf)をviまたはお好きなエディタで開きます(好みの場合はyum install nano)そして、server_nameディレクティブを見つけます。
- sudo vi /etc/nginx/conf.d/my-website.com.conf
server {
. . .
server_name my-website.com www.my-website.com
. . .
}
もしwww.my-website.comをmy-website.comにリダイレクトしたい場合は、server_nameの行からwww.my-website.comを削除し、ファイルを保存して終了します。(もしmy-website.comをwww.my-website.comにリダイレクトしたい場合は、その代わりにmy-website.comを削除してください。)
その後、新しいNginxの設定ファイルを作成します。ファイルの場所は/etc/nginx/conf.d/www.my-website.com.conf(もしくはリダイレクト先の名前がmy-website.comの場合は/etc/nginx/conf.d/my-website.com.conf)です。ファイル名は好きなように指定してくださいが、Nginxの設定ファイルは全て.confで終わる必要があります。
- sudo vi /etc/nginx/conf.d/www.my-website.com.conf
自分のドメイン名であるmy-website.comを使用して、次のようなサーバーブロックをファイルに追加してください。
server {
server_name www.my-website.com;
return 301 $scheme://my-website.com$request_uri;
}
もし、my-website.comをwwwサブドメインにリダイレクトする場合は、server_nameにはmy-website.comのみを入力し、次の行のURLにはwww.my-website.comを指定してください。
終わったら保存して終了してください。
Nginxを設定して、www.my-website.comをリクエストするクライアントに対して301リダイレクトを送信し、代わりにmy-website.comを訪れるように指示します。このリダイレクトはリクエストURIを保持するため、http://www.my-website.com/login.phpへのリクエストはhttp://my-website.com/login.phpにリダイレクトされます。
Note
変更を適用する前に、Nginxの設定がエラーなしであることをチェックしてください。
- sudo nginx -t
もし構文エラーが発生していない限り(例えばセミコロンを忘れたなど)、設定は正常であるはずです。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
新しいリダイレクトルールを適用するために、Nginxを再起動してください。
- sudo systemctl restart nginx
ブラウザでwww.my-website.comを訪れる前に、サーバーまたはローカルマシン(curlがローカルにインストールされている場合)でcurlを使用してリクエストを行ってください。
- curl -IL http://www.my-website.com
「-I」フラグは、curlにサーバーレスポンスのヘッダーのみを表示するよう指示します。「-L」フラグは、curlにサーバーからのリダイレクトに従い、自動的に2度目のリクエストを行うように指示します。この際、Locationヘッダーに指定されたURLに対して行います(ウェブブラウザと同じように)。301リダイレクトを設定したため、curlは2度のリクエストを行い、2つのレスポンスのヘッダーのみが表示されるはずです。
HTTP/1.1 301 Moved Permanently Server: nginx/1.20.1 Date: Thu, 08 Dec 2022 19:24:44 GMT Content-Type: text/html Content-Length: 169 Connection: keep-alive Location: http://my-website.com HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Thu, 08 Dec 2022 19:24:44 GMT Content-Type: text/html Content-Length: 57 Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT Connection: keep-alive ETag: “63892671-39” Accept-Ranges: bytes
最初のリクエストであるhttp://www.my-website.comへの301(永久的に移動しました)のレスポンスで、最後のヘッダに注目してください: Location: http://my-website.com。2つ目のレスポンスはcurlのフォローアップリクエストであり、もしウェブサイトが正常であれば、サーバーは200(OK)で応答しているはずです。
最後に、ウェブブラウザでhttp://www.my-website.comを訪れてください。まばたきをするとリダイレクトが見逃されます。通常通りウェブサイトが表示されますが、アドレスバーを再度確認するとURLから「www」が消えていることに気づくでしょう。ほとんどのユーザーは気づかないため、http://my-website.comをリクエストしたのと同じ体験を得ることができます。
結論
このチュートリアルでは、ウェブサイトに2つのDNSレコードを追加し、Nginxを設定してセカンダリドメインを優先ドメインにリダイレクトしました。これにより、ウェブサイトは両方のドメインからアクセス可能になりました。もしかすると、このチュートリアルを読む前から既にそうだったかもしれません。おそらく、両方のドメイン名から直接提供されていました。しかし、たった4行のNginxの設定で、ウェブサイトの検索エンジンに対する評価が向上し、それによりインターネット上でより多くのユーザーに公開されるようになりました。
どのサーバーブロックが特定のリクエストを処理するか、Nginxがどのように決定するかについて、より詳しい情報をお探しですか?以下のガイドをご覧ください:Nginxのサーバーブロックとロケーションブロックの選択アルゴリズムを理解する。