リダイレクトは、サイトドメインの引っ越し・SSL化(https化)などによって、ページURLが変化した際に使用されるケースが多いです。
リダイレクトの設定はPHPやHTMLなどでも可能ですが、Googleでは「.htaccess(ドット・エイチティー・アクセス)ファイル」を用いる方法が推奨されています。
この記事では
・「.htaccess」ファイルを使用するためのサーバー環境
・パターン別の書き方サンプル
・リダイレクトが効かないときの対処方法
これらについてご紹介します。
.htaccessを使用するためのサーバー環境
.htaccessファイルでリダイレクトを設定するには、サーバーが以下の条件をクリアしている必要があります。
・Webサーバーが「Apache(アパッチ)」である
・Webサーバー上で「.htaccessファイル」を利用できる
・Apache の「mod_rewriteモジュール」使える(※必須ではない)
「Apache」とは、世界中で多くのシェアを有するWebサーバーソフトウェアで、国内の多くのレンタルサーバーで使用されています。
mod-rewriteモジュールは、Apacheに組み込む部品のようなもので、URLの書き換えやリダイレクト処理を行います。
社内に「人事部」「営業部」などがあるように、
リダイレクトという仕事を担当する部署として「mod_rewrite」がサーバー内に組み込まれてる、というイメージです~。
▼主要レンタルサーバーのサポート状況
|
Apache |
mod_rewrite |
---|---|---|
さくらインターネット |
〇 |
〇 |
ロリポップ |
〇 |
〇 |
WADAX |
〇 |
〇 |
Xserver |
〇 |
〇 |
カゴヤ・ジャパン |
〇 |
〇 |
お名前.com |
〇 |
〇(一部制限あり) |
GMOクラウドレンタル サーバー iCLUSTA+ |
〇 |
〇(一部制限あり) |
KDDI CPIレンタルサーバー |
〇 |
〇 |
クイッカ |
〇 |
〇 |
※情報は2019年11月時点のものです。サービス内容は変更される場合があります。
Apache以外のサーバーでも、htaccess を利用できるようサポートしているケースもあるです~。詳しくは利用サーバーのマニュアルなどを確認してほしいです~。
.htaccessでの301リダイレクトのやり方
.htaccessファイルで301リダイレクトを行う際には、ファイル内に必要な内容を記述します。
.htaccessファイルの編集方法は利用環境によって異なりますが、次の3つが一般的です。
・レンタルサーバーの管理画面から編集
・Wordpressで自動生成されたファイルを編集
・ローカル環境上でテキストエディタを使用する
3つのなかで初心者にオススメなのは、レンタルサーバーでの編集です~。
逆に、ローカル環境での編集はちょっとややこしいので、他の方法が使えない場合に参考にして欲しいです~。
レンタルサーバーの管理画面から編集
レンタルサーバーの管理画面には、.htaccessファイルの編集機能が用意されているケースが多いです。
「ファイルマネージャー」という機能を利用して簡単に.htaccessファイルを作成できたり、管理パネル内から編集できたりするので、
サイト運営初心者でもスムーズに作業を進められます。
詳しくは、利用中のレンタルサーバーの公式サイト・ユーザーマニュアルなどをご参照ください。
WordPressで自動生成されたファイルを編集
WordPressをインストールした際、.htaccessファイルは自動的に生成されます。
ファイルを探してバックアップを用意した後、適宜編集しましょう。
ただし、環境設定によってはファイルが非表示になっていたり、生成に失敗していたりするケースがあります。
利用環境で.htaccessファイルが見つからない場合は、以下の3つをチェックしてください。
1.ローカルPCの設定
2.FTPソフトの設定
3.wordpressの権限
【1.ローカルPCの設定】
ローカルPCの設定によって.htaccessファイルが非表示になっている場合、WindowsとMacで対処法が異なります。
詳細は以下のリンクをご参照ください。
▼Windows
https://support.microsoft.com/ja-jp/help/14201/windows-show-hidden-files
▼Mac
https://qiita.com/TsukasaHasegawa/items/fa8e783a556dc1a08f51
【2.FTPソフトの設定】
FTPソフト側で、.htaccessファイルを非表示にしているケースもあります。
「隠しファイルを表示」できるよう設定を変更すれば良いのですが、細かいやり方はFTPソフトごとに異なります。
そのため、ソフトのマニュアルなどを見ながら対応する必要があります。
なお、主要FTPソフト2種での設定変更の方法については、以下のページをご参照ください。
▼WinSCP
https://qiita.com/fukaken5050/items/5a7b5be893276ba5a1b4
▼FileZilla
https://qiita.com/camomile_cafe/items/7bc7a0df829a27bb5869
【3.Wordpressの権限】
WordPressにフォルダ書き込み権限がないために、.htaccessの生成に失敗している場合があります。
この場合、Wordpressに適切な権限を与えることで解決できます。
ちなみに、この権限のことを「ファイルパーミッション」と呼ぶです~。
詳しくは、この記事の後半で解説してるですよ~。
ローカル環境上でテキストエディタを使用する
▼おおまかな流れ
1.「メモ帳(Windows)」や「テキストエディット(Mac)」など、適当なテキストエディタで.htaccessファイルを作成
2.ファイル内に301リダイレクト設定を書き込む
3.サイト内の任意のディレクトリにアップロード(※トップディレクトリに設置するのが一般的)
作業するときには、次の3点に注意しましょう。
・「.htaccess」ファイルの名前
・文字コード・改行コード
・「.htaccess」ファイルの設置場所
【.htaccessファイルの名前】
ローカル環境上でファイル名を決定する際には、「.」から始まる名前や「.htaccess」拡張子(※)を使用できないケースがあります。
その場合は、「*.txt」など適当な名前を設定したうえで編集を進めていきましょう。
ファイルのアップロード完了後に、名前を「.htaccess」に変更すれば問題ありません。
※拡張子とは
ファイル名の最後に付く「.txt」「.html」などの文字。
ただし、ファイルの拡張子が「.txt」のままだと、リダイレクト設定が効かなくなるので注意しましょう。
【文字コード・改行コード】
.htaccessファイル作成時には、以下の記述形式を用いる必要があります。
・文字コード:UTF-8
・改行コード:LF(ラインフィード)
特にMacで編集したファイルには、改行コードとして「CR(キャリッジリターン)」が含まれるケースがあるので注意が必要です。
【.htaccessファイルの設置場所】
.htaccessファイルは原則トップディレクトリに設置しましょう。
.htaccessファイルの記述内容が反映されるのは、該当ファイルが設置されたディレクトリと、それより下のディレクトリのみです
つまり、.htaccessファイルより上のディレクトリにあるファイルには、リダイレクト処理が反映されません。
▼.htaccessファイルが影響する範囲 イメージ図
また、.htaccessファイルの設置ディレクトリが変化すると、記述内容を修正する必要が出てくる場合もあります。
.htassessファイルを変な場所に置くと、リダイレクトが効かなくなったり、編集の手間が増えたりして、厄介くまね。
.htaccessの301リダイレクト「パターン別の書き方」
.htaccessを用いた301リダイレクトの書き方を、パターンごとにまとめているです~。
実際の作業時に役立ててほしいです~。
※302リダイレクトを行う場合は、各サンプル中の[R=301,L]という記述を[R=302,L]に書き換えてください。
1.特定ページへのリダイレクト
▼https://example.com/page.htmlからhttps://example.com/new-page.htmlへ転送
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^page\.html$ https://example.com/new-page.html[R=301,L]
</IfModule>
※.htaccessファイルを「examle.com」ドメインのトップディレクトリに設置した場合の記述例
※記述の最後は空白行を設ける。以降のサンプルでも同様。
2.ディレクトリ単位でのリダイレクト(同一ドメイン内)
▼「old」ディレクトリから「new」ディレクトリへ転送
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^old/(.*)$ /new/$1 [R=301,L]
</IfModule>
1ページずつ設定を書かなくても、まとめてリダイレクトできるから便利です~。
ただ、上記のサンプルを使用する場合は以下の点に注意してほしいです~。
・リダイレクト先は「/(スラッシュ)」から書き始める
・指定ディレクトリ(「old」や「new」など)より下の階層では、ファイルの名称・構成を同じにする必要がある
3.ドメイン単位でリダイレクト
▼「old.com」ドメインから「new.com」ドメインへ転送
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^old\.com
RewriteRule ^(.*) https://new.com/$1 [R=301,L]
</IfModule>
このパターンを使用するときも、指定ドメインより下のディレクトリでは、ファイル名や構成を同じにする必要があるので注意ですよ~。
4.URLの正規化
正規化って何だくま?
ひとつのページに対応するURLが複数あるとき、URLを統一することです~。
URL中の「www」の有無を揃えたり、「http」ページを「https」ページに移行したりするときに使うです~。
【「www」の有り無しを統一する】
▼「www」有りに統一する
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*) https://www.example.com/$1 [R=301,L]
</IfModule>
▼「www」無しに統一する
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*) http://example.com/$1 [R=301,L]
</IfModule>
【「index.html」無しに統一する】
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index\.html$ https://example.com/$1 [R=301,L]
</IfModule>
【httpからhttpsへのリダイレクト</h3>】
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
</IfModule>
5.複数URLを同じリダイレクト先に転送
この場合、複数URLの転送先はひとつだけ、ってことくまね?
どんなときに必要になるサンプルなんだくま?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* http://example.com [R=301,L]
</IfModule>
サイトメンテナンスで一時的な転送をする場合は、末尾を[R=302,L]に書き換えて、302リダイレクトに変更するのを忘れないようにするですよ~
6.ファイル単位のリダイレクト
▼「services/old-file.php」へのアクセスを「services/new-file.php」へリダイレクト
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^services/old-file.php /services/new-file.php [R=301,L]
</IfModule>
7.特定の種類のファイルのみリダイレクト
▼ファイル拡張子が「.webp」か「.webp」の場合のみ、「new-img」ディレクトリにリダイレクトする(※同ドメイン内)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^.*\.webp|\.webp
RewriteRule ^img/(.+) /new-img/$1 [R=301,L]
</IfModule>
8.特定のディレクトリ・ファイルを除外してリダイレクト
▼ディレクトリ「dir」を除外して、新ドメイン「new.com」へ転送
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !(^/dir/)
RewriteRule ^(.*) https://new.com/$1[R=301,L]
</IfModule>
▼特定ファイルを除外して新ドメイン「new.com」へ転送
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(除外したいファイルの拡張子|除外したいファイルの拡張子2)$ [NC]
RewriteRule ^(.*) https://new.com/$1[R=301,L]
</IfModule>
たとえば画像やCSSファイルを除外して転送したい場合、次のように書けばOKです~。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(webp|webp|webp|webp|css)$ [NC]
RewriteRule ^(.*) https://new.com/$1[R=301,L]
</IfModule>
リダイレクトが効かないときの対処法
・サーバー環境
・.htaccessのファイルパーミッション
・細かい記述ミス
・ブラウザの301転送キャッシュ
サーバー環境
サーバーによっては、.htaccessファイルの設置が許可されていないケースもあります。
サーバー管理会社に問い合わせたり、マニュアルを参照したりして確認しましょう。
また、この記事で紹介した記述サンプルは、Apacheサーバーの「mod_rewrite」モジュールが利用できる状態を前提にしています。
サーバーでmod_rewriteが作動しない場合、リダイレクト処理が実行できません。
利用サーバーでmod_rewriteが使えるかどうかは、下記のコードを用いて確認することが可能です。
▼コード内容
<IfModule mod_rewrite.c>
ErrorDocument 404 http://www.google.com/
</IfModule>
▼確認方法
1.上記のコードを.htaccessファイル内に記入
2.サイト内の存在しないURLにアクセスする
→Googleの公式ページへリダイレクトされた場合は、mod_rewriteが使用できる!
→404エラーページが表示された場合は、mod_rewriteは使用できない
.htaccessのファイルパーミッション
.htacccessファイルのパーミッション(※)の設定が適切でないと、リダイレクト設定は反映されません。
.htacccessファイルで推奨されるパーミッションは、「604」「606」「644」などです。
ただし、サーバーによって異なる設定を推奨している場合もあるので、適宜ユーザーマニュアルなどを参照してください。
※ファイルパーミッションとは
ファイルごとに設定されるアクセス許可情報。
ファイルパーミッションを参照すると、そのファイルに対して、誰がどんなことをできる状態なのか確認できる。
.htaccessのファイルパーミッション設定が適切でないと、サーバー側でファイル内容の読み取りやプログラムの実行ができず、リダイレクトが反映されなくなる。
細かい記述ミス
.htacessファイル内の細かい記述ミスによって、リダイレクトが効かなくなるケースがあります。
記述内容について次の点を確認してみましょう。
・リダイレクト記述の最後に空白行があるか
・半角スペースが抜けてたり、余分に記述されていたりしないか
・細かいスペルミスがないか
また、利用しているレンタルサーバーによっては、独自の書き方をしなければならない場合もあります。
ユーザーマニュアルなどを確認してみてください。
ブラウザの301転送キャッシュ
リダイレクトの転送先URLを変更するとき、ブラウザに「301転送キャッシュ(※)」があると、変更情報が反映されません。
301転送キャッシュを残す代表的なブラウザとしては、Googleクロームがあげられます。
Googleクロームの301転送キャッシュを削除する方法については、以下のリンクをご参照ください。
https://qiita.com/tatsuo-iriyama/items/be8e8862738748986ce1
また、301転送キャッシュによるエラーを回避するには、.htaccessファイルを編集するとき、最初に302リダイレクトでテストすると良いでしょう。
転送処理が正常に作動するのを確認した後、ファイルの記述を301リダイレクトに変更すれば、ブラウザ側に余計なキャッシュを残すリスクはなくなります。
※301転送キャッシュとは
301リダイレクトが行われた際に、ブラウザ上に保存されるキャッシュ情報です。
ブラウザのなかには、301リダイレクトを認識したとき、転送前後のURLをキャッシュとして保存するものがあります。
その後、同じ転送元URLにアクセスがあった場合は、リダイレクト処理を省略し、保存された転送先URLに直接アクセスします。
このとき、.htaccessファイル内で転送先URLを変更しても、ブラウザはその内容を参照しません。
結果的に、変更前の転送先URLにアクセスされ続けてしまい、リダイレクトが反映されなくなります。
「.htaccessリダイレクト」のおさらい
・「.htaccess」を利用するには、サーバーに「Apache(アパッチ)」と「mod_rewrite」が必要
・「.htaccess」の編集は「レンタルサーバー」「Wordpress」「ローカル環境」などで行う
・リダイレクトが効かない場合は「サーバー環境」「.htaccessのファイルパーミッション」「細かい記述ミス」「ブラウザの301転送キャッシュ」をチェック