CentOS 7でApacheを用いてwwwを非wwwにリダイレクトする方法
はじめに
多くのウェブ開発者は、ユーザーがウェブサイトやアプリケーションにwwwサブドメインとルート(wwwなし)ドメインの両方を通じてアクセスできるようにする必要があります。つまり、www.my-website.comとmy-website.comを訪れる際にユーザーが同じ体験をすることが求められます。設定方法はいくつかありますが、最もSEOに友好的な解決策は、好きなドメイン(サブドメインまたはルートドメイン)を選択し、そのドメインを訪れるユーザーを他方のドメインにリダイレクトすることです。
様々な種類のHTTPリダイレクトがありますが、このシナリオでは301リダイレクトを使用することが最適です。これはクライアントに対して「リクエストしたウェブサイトは別のURLに完全に移動しました。そちらへ移動してください。」と伝えます。ブラウザがサーバーからHTTP 301のレスポンスコードを受信すると、サーバーから与えられた新しいURLに対して2回目のリクエストを送信し、ユーザーはウェブサイトを表示されます。おそらくリダイレクトされたことに気づかずに。
なぜウェブサーバーの設定を変更して、両ドメイン名へのリクエストに同じウェブサイトを提供しないのですか?これは簡単に見えるかもしれませんが、301リダイレクトのSEOの利点がありません。301リダイレクトは検索エンジンのクローラーに、ウェブサイトの正規の場所があることを伝え、そのURLの検索順位を向上させます。
このチュートリアルでは、CentOS 7上のApacheを使用して301リダイレクトを設定します。もしApacheの代わりにNginxを使用している場合は、代わりにこのチュートリアルを参照してください:CentOS 7上でNginxを使用してwwwから非wwwにリダイレクトする方法。
前提条件
このチュートリアルを完了するためには、最初に次のものが必要です:
- Superuser privileges on the server that is running Apache. If you don’t already have that set up, follow our Initial Server Setup with CentOS 7 guide.
- Apache installed and configured to serve your website. Follow this tutorial to do that: How to Install the Apache Web Server 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の両方をApacheサーバーにポイントする必要があります。 (以下のチュートリアルの残りでは、あなたのドメインがmy-website.comであるという前提で進めます。以下で見る場所では、それをあなた自身のドメインに置き換えてください。) これを行うためには、それぞれの名前に対してDNS Aレコードを作成し、それをApacheサーバーのIPアドレスにポイントさせる必要があります。
DNSプロバイダーのウェブコンソールを開いてください。このチュートリアルではSilicon Cloud DNSを使用します。
「ドメイン追加」フォームに、登録済みのドメイン名をテキストフィールドに入力し、ドメインを追加ボタンをクリックしてください。これにより、新しいドメインのページが表示され、ドメインのレコードを表示、追加、削除することができます。
「新しいレコードを作成」の下にあるHOSTNAMEテキストフィールドに「@」と入力してください。これは、ルートドメイン名に対するレコード、つまり単にmy-website.comのレコードを追加することを示す特殊文字です。WILL DIRECT TOテキストフィールドにサーバーのパブリックIPv4アドレスを入力し、「レコードを作成」をクリックしてください。(TTLの変更は必要ありません。)
第二のDNSレコードでは、Aレコードの代わりにCNAMEレコードを使用することができます。CNAMEレコードはIPアドレスの代わりに別の名前を指すエイリアスです。www.my-website.comをmy-website.comに向けるCNAMEを作成することができ、wwwサブドメインのHTTPリクエストは、ルートドメインのAレコードを作成したため、サーバーに到達します。しかし、簡単にするために、最初と同じように別のAレコードを作成し、HOSTNAMEフィールドに「www」を入力し、WILL DIRECT TOフィールドにサーバーの公開IPアドレスを入力してください。
あなたが両方のレコードを作成した後、それはこのように見えるはずです。 (Anata ga ryōhō no rekōdo o sakusei shita ato, sore wa kono yō ni mieru hazu desu)
2つのレコードが設定されているため、my-website.comとwww.my-website.comへのWebリクエストは、Apacheサーバーに到達するはずです。さて、サーバーを設定しましょう。
ステップ2 — Apacheでのリダイレクトの設定
Apacheウェブサーバーには、リダイレクトを設定するための2つのモジュールがあります: mod_aliasとmod_rewriteです。mod_rewriteはよりパワフルですが、mod_aliasは理解と使用がより直感的です。例えば、特定のクエリ文字列やHTTPヘッダーを含むリクエストをリダイレクトする必要がある場合は、mod_rewriteを使用する必要があります。mod_aliasには欠けている正規表現マッチング機能を備えたmod_rewriteを選択する人も多くいます。ただし、www.my-website.comのすべてのリクエストをmy-website.comにリダイレクトするという単純なケースでは、mod_aliasで十分です。(Apache自体は、必要のない場合にmod_rewriteを選択すると「混乱しやすく、壊れやすく、保守が困難な設定になる」と述べ、可能な限りmod_aliasを選択することを推奨しています。)
デフォルトでCentOS 7ではモジュールが有効化されているはずですが、確認するためにはこのコマンドを実行してください。
- httpd -M | grep alias_module
出力にalias_module (shared)が表示された場合、モジュールはすでに有効になっています。表示されない場合は、/etc/httpd/conf.modules.d/00-base.confにこの行を追加して有効にしてください。
- echo “LoadModule alias_module modules/mod_alias.so” | sudo tee -a /etc/httpd/conf.modules.d/00-base.conf
mod_aliasを有効にすると、Apacheの設定でRedirect、RedirectMatchなどの指示文やmod_aliasドキュメントにリストされたその他の指示文を使用することができます。
では、今、あなたのVirtualHostを設定しましょう。
前提条件に記載されている通り、Apacheでウェブサイトが設定されている必要があります。これは主なApacheの設定ファイル(/etc/httpd/conf/httpd.conf)または独自のファイル(例:/etc/httpd/conf.d/my-website.com.conf)に設定されているかもしれません。前提条件にリンクされたApacheインストールガイドを使用してVirtualHostを設定した場合は、/etc/httpd/sites-available/my-website.com.confのようなファイルに保存されているかもしれません。メインサイトの設定がどこであるかに関わらず、viまたはお好みのエディタ(nanoをご希望の場合はyum install nano)でそのファイルを開いてください。
- sudo vi /etc/httpd/conf/httpd.conf
以下の文章を日本語で言い換えると、「VirtualHostで設定されているServerAliasディレクティブを探してください。もし、ServerAliasにwww.my-website.comと設定された行があれば、その行を削除してください(もしこの行にカンマで区切られた他のエイリアスが複数ある場合、リストからwww.my-website.comのみを削除してください)。このエイリアスを削除する必要があるのは、サブドメインのために別のVirtualHostを作成し、ServerNameとRedirectだけを含むようにするためです。メインのVirtualHostではもはやwww.my-website.comのリクエストを処理しないようになります。」
別のファイル(例:/etc/httpd/conf.d/www.my-website.com.conf)にVirtualHostを作成してください。
- sudo vi /etc/httpd/conf.d/www.my-website.com.conf
以下のコンテンツをファイルに貼り付けてください。”my-website.com”というドメイン名をあなた自身のドメイン名に置き換えてください。
「/etc/httpd/conf.d/www.my-website.com.conf」
<VirtualHost *:80>
ServerName www.my-website.com
Redirect permanent / http://my-website.com/
</VirtualHost>
作業が終了したら保存して終了してください。もしもこのファイルを/etc/httpd/sites-availableで作成した場合は、Apacheのインストールガイドに従い、/etc/httpd/sites-enabled/に対してもファイルのシンボリックリンクを作成してください。
- sudo ln -s /etc/httpd/sites-available/www.my-website.com.conf /etc/httpd/sites-enabled/
この新しいVirtualHostは、Apacheを設定して、www.my-website.comを要求するクライアントに301リダイレクトを送信し、それらを代わりにmy-website.comを訪れるように導きます。リダイレクトはリクエストURIを保持するため、http://www.my-website.com/login.phpへのリクエストはhttp://my-website.com/login.phpにリダイレクトされます。
Note
もし*.my-website.comのServerAliasを保持しなければならない場合は、Apacheが新しいwwwのVirtualHostをメインのものの前にロードするようにする必要があります。なぜなら、メインのVirtualHostが最初にロードされると、その名前がワイルドカードのエイリアスに一致するため、www.my-website.comのリクエストを処理するためにそれが使用されるからです。次のコマンドを実行して、Apacheを再起動するときに最初にロードされるVirtualHostを確認してください:
httpd -S
namevhost my-website.comとnamevhost www.my-website.comを含む行を探してください。もしwwwの行が最初に表示される場合、設定は完了です。しかし、ルートドメインのVirtualHostが最初に表示される場合は、ApacheがwwwのVirtualHostを最初にロードするためのいくつかの方法があります:
もし、メインのVirtualHostがファイル(例:/etc/httpd/conf/httpd.conf)に含まれており、IncludeまたはIncludeOptionalディレクティブを使用して新しいwwwのVirtualHostの含まれているディレクトリを含んでいる場合は、そのInclude行をファイル内のメインのVirtualHostの上に移動させてください。
もし、メインのVirtualHostと新しいwwwのVirtualHostのファイルが同じディレクトリに含まれている場合(例:/etc/httpd/conf.d/)、ファイル名の前に数値を付けてApacheにwwwのVirtualHostを最初にロードさせることができます。例えば、wwwのVirtualHostのファイル名に01-を付け足してください(例:/etc/httpd/conf.d/01-www.my-website.com.conf)、そしてメインのVirtualHostのファイル名に02-を付け足してください(例:/etc/httpd/conf.d/02-my-website.com.conf)。
再度、httpd -Sを実行して、wwwのVirtualHostが最初に表示されることを確認してください。
準備ができたら、Apacheを再起動してください。
- sudo systemctl restart httpd
あなたのブラウザでwww.my-website.comを訪れる前に、curlを使用してサーバーまたはローカルマシン(curlがローカルにインストールされている場合)でリクエストを行ってください。
- curl -IL http://www.my-website.com
-Iフラグは、curlにサーバーのレスポンスからヘッダーのみを表示するように指示します。-Lフラグは、curlにサーバーからのリダイレクトを従順に処理するように指示し、自動的に2回目のリクエストをURLで示されたロケーションヘッダーのURLに行います(ウェブブラウザと同じように)。301リダイレクトを設定したので、curlは2回のリクエストを行い、2つのレスポンスのヘッダーのみを表示するはずです。
HTTP/1.1 301 Moved Permanently Date: Tue, 03 Jan 2023 19:24:44 GMT Server: Apache/2.4.53 Location: http://my-website.com/ Content-Type: text/html; charset=iso-8859-1 HTTP/1.1 200 OK Date: Tue, 03 Jan 2023 19:24:44 GMT Server: Apache/2.4.53 Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT ETag: “39-5eecb7ed6bfc9” Accept-Ranges: bytes Content-Length: 57 Content-Type: text/html; charset=UTF-8
最初の要求であるhttp://www.my-website.comへの301(永久に移動した)のレスポンスで、最後から2番目のヘッダーに注目してください:Location: http://my-website.com。2番目のレスポンスは、そのLocationヘッダーで指定されたURLへのcurlの追跡リクエストからのものであり、ウェブサイトが正常であれば、サーバーは200(OK)で応答するはずです。
最後に、ウェブブラウザでhttp://www.my-website.comを訪れてください。まばたきをするとリダイレクトが見逃されてしまいます。通常どおりウェブサイトが表示されますが、アドレスバーを見るとURLから「www」が抜けていることに気づくでしょう。ほとんどのユーザーは気づかないため、http://my-website.comを要求した場合と同じ体験をすることができます。
結論
このチュートリアルでは、ウェブサイトのために2つのDNSレコードを追加し、Apacheを設定してセカンダリーのドメインを優先されるドメインにリダイレクトさせました。これにより、ウェブサイトは両方のドメインからアクセス可能になりました。もしかすると、このチュートリアルを読む前から既にそうだったかもしれません。おそらく、両方のドメイン名から直接提供していたかもしれません。しかし、Apacheの設定にわずか4行追加するだけで、検索エンジンの目に留まるウェブサイトの評価を向上させ、それによりインターネット上のより多くのユーザーに公開することができました。
もっと強力なmod_rewriteモジュールについて知りたいですか?Ubuntu 22.04上のApacheでURLを書き換える方法については、当社のチュートリアルをご覧ください。