エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


サイト更新、引越時に.htaccessでリダイレクトする方法解説

      2018/03/25

.htaccessのRewrite Engineの処理でリダイレクト

 

.htaccessでサイト更新、引越し時にリダイレクトさせる方法の概要

 
サイトをリニュアルして URLが変った時、引越しをしてドメインが変った時などに、.htaccessを使ってリダイレクトさせるときの処理の書き方について解説します。
 
タイトルも上記の説明にも「リダイレクト」と書いていますが、実際の処理は URLを書き換える処理ですので「リライト」が正しいです。
そもそも .htaccessに書くの処理が「Rewrite」ですし。
 
 
リダイレクト(リライト)する処理としては「Redirect」を使って記述する方法もありますが、「Redirect」を使う方法はページの下部の「.htaccessのRedirectの処理でリダイレクト」に記載していますので、併せて参考にしてください。
 
また、「リダイレクトの処理もキャッシュする」に記載していますが、.htaccessのリダイレクトの処理もブラウザがキャッシュを保持しますので、ご注意ください。
 
 

.htaccessのRewrite Engineでのリダイレクト処理解説

 

リダイレクト処理の .htaccessの記述方法

 
ドキュメントルートに「.htaccess」ファイルを作成し、以下の内容を記述します。
 

 
 

リダイレクト処理の .htaccessの記述方法の解説

 
以下、説明をしていきます。
 

RewriteEngine on

「RewriteEngine on」でリダイレクトする処理を宣言します。
サーバによっては、「RewriteEngine」を許可していない場合もありますので、サーバの使用を確認してみてください。
 

RewriteBase /

リダイレクト処理のベースを宣言します。
「/」はドキュメントルートから始まることを明示しています。
特定のフォルダの場合はここを変更します。
 

RewriteRule

3行目~6行目までの「RewriteRule」では、リダイレクトの設定を行います。
旧サイトから新サイトに作り変える際にページの URLが変ったページの指定を行います。
 
指定の方法は下記の様になります。
  RewriteRule 旧ファイル 新URL [オプション]
 
オプションの「R=301」は、「301転送(恒久的なURLの変更)」を意味しています。一時的な URLの変更の場合は「302」を指定します。
「L」は、条件にマッチした際にはそこで処理を終了させることを意味しています。
 
RewriteRule ^old\.html$ http://example.com/new1.html [R=301,L]
3行目は、「old.html」から「new1.html」に切り替わった 1:1のページリダイレクトの設定です。
 
RewriteRule ^test1/old2\.html$ http://example.com/new2.html [R=301,L]
4行目は、3行目と違い、フォルダも指定する形で「/test1/old2.html」から「new2.html」に切り替わったリダイレクトの設定です。
 
RewriteRule ^test1/test2/ http://example.com/new3.html [R=301,L]
5行目は、「/test1/test2/」のフォルダの中どの URLであっても「new3.html」にリダイレクトする、という処理です。
 
RewriteRule ^test1/test3/(.*)$ http://example.com/$1 [R=301,L]
6行目は、「/test1/test3/」のフォルダの中の指定されたファイルをドキュメントルートの URLに差し替えてリダイレクトする、という処理です。
具体的には下記の様にリダイレクトします。
「http://old.com/test1/test3/aa.html」を「http://example.com/bb.html」に
「http://old.com/test1/test3/bb.html」を「http://example.com/bb.html」に
 
 

RewriteCond

「RewriteCond」は、リライトするための条件を指定します。
指定の方法は下記の様になります。
  RewriteCond 値 条件 [オプション]
 
複数の条件を指定する場合は、「RewriteCond」の行を追記していきます。
サンプルではオプションを記述していませんが、オプションを記述しない場合は「[AND]」が指定されています。
これを OR条件にしたい場合は「[OR]」を指定します。
また、判定パターンで大文字小文字を判別しない場合は「[NC]」を指定します。
 
 
RewriteCond %{REQUEST_URI} !(^/$)
ここでは「{REQUEST_URI}」(取得されたURL)が、「!(^/$)」(トップページではない)ときに処理を実行する、という内容です。
 
RewriteCond %{REQUEST_FILENAME} !-f
「-f」は条件がファイルの存在有無の確認で、「!-f」ですので、ファイルがない場合が Trueになります。
 
RewriteCond %{REQUEST_FILENAME} !-d
上記とほぼ同じでこちらは、「-d」は条件がフォルダの存在有無の確認で、「!-d」ですので、フォルダがない場合が Trueになります。
 

RewriteRule ^(.*)$ / [R=301,L]

先の「RewriteCond」の条件に合致する場合に処理を行う部分です。
「^(.*)$」いずれの条件の場合も「/」(サイトトップ)にリダイレクトする、という内容になります。
 
ここでは、それの前の「RewriteCond」の条件である、「トップページでなく」かつ「ファイルがない」かつ「フォルダがない」場合にこのリダイレクトが実行されます。
 
 

ErrorDocument 404 /

 
アクセスしたページがない場合に特定のページを表示させる、という処理は、「ErrorDocument」を使って記述することができます。
 
7行目~10行目の「RewriteRule ^(.*)$ / [R=301,L]」のあたりの代わりに、
  ErrorDocument 404 /
 
と記述することで、ページがない場合はトップページを表示させる、という処理を記述することは可能です。
 
ただし、この場合、リダイレクト(リライト)とは違い、「エラーページとしてどのページを表示するか」の設定のため、URLが切り替わりません。
 
例えば、「http://example.com/bb」と入力した場合、URLはそのままで、トップページと同じページが表示されるだけですので、ユーザはページがないことに気付かないかもしれません。
 
それどころか、検索エンジンは、この方法を推奨しておらず、しっかりと存在しないページであることを伝えるページを作ることを推奨していますので、この方法は SEOの視点からも避けるべき設定です。
 
 

リダイレクトの処理もキャッシュする

 
これらのリダイレクトの処理を作成する際に一番注意する必要がある点は、ブラウザがリダイレクトの設定をキャッシュしてしまう点です。
ブラウザによって処理に差異がありますが。
 
そのため、「.htaccess」を修正しながらテストをしている際に、修正したのに前の設定が残っていて、いろいろ設定を変えてトライしてみてもなかなかうまく動かず、何が間違っているのか延々と悩む結果につながる可能性があることを頭の片隅に入れておきましょう。
 
リダイレクトの動作確認を行ったら、その都度ブラウザのキャッシュをクリアする、という作業をしておく方が安全です。
 
 


 
 

.htaccessのRedirectの処理でリダイレクト

 

.htaccessでサイト更新、引越し時にリダイレクトさせる方法の概要

 
ここでは、「Redirect」を使って記述する方法を解説していますが、「RewriteEngine」を記述してリダイレクトさせる処理の場合は「.htaccessのRewrite Engineでのリダイレクト処理解説」に戻って確認してください。
 
 

.htaccessのRedirectでのリダイレクト処理解説

 

リダイレクト処理の .htaccessの記述方法

 
ドキュメントルートに「.htaccess」ファイルを作成し、以下の内容を記述します。
 

 
 

リダイレクト処理の .htaccessの記述方法の解説

 
このリダイレクトの記述の方法は、「.htaccessのRewrite Engineでのリダイレクト処理解説」に比べると分かりやすい記述になっています。
 
 

Redirect 301 /aaaa/bbbb.html http://new.com/xxxx/zzzz.html

URLが「/aaaa/bbbb.html」だったら、「http://new.com/xxxx/zzzz.html」に 301リダイレクトします、という内容です。
パッと見て分かりやすい構造です。
 

RedirectMatch 301 .* http://new.com/index.html

URLが「.*」にマッチしたら「http://new.com/index.html」に 301リダイレクトします、という内容です。
「.*」は正規表現で「全ての文字列」という意味ですので、全ての URLをリダイレクトさせる、という意味です。
 
 
また、この「Redirect」のリダイレクト処理は、上から順番に処理をしていきます。
そのため、この処理全体で、以下のような意味になります。
 指定してある URLの場合は指定の URLにリダイレクトします。
 指定されていない URLの場合はまとめて新サイトのトップページへリダイレクトします。
 
 
また、「301」は恒久的な URLの変更のための設定で「permanent」と記述することもできます。
サーバによっては「301」もしくは「permanent」のいずれかしか受け付けない場合もありますので、どちらかで動かない場合は反対の方を試してみてください。
 
また、一時的な変更の場合は「302」を指定してください。
 
 
詳しくは、下記のサイトが参考になりました。
 http://htaccess.cman.jp/explain/redirect.html
 
 

Redirectでのリダイレクトのデメリット

 
この「Redirect 301」を使ってのリダイレクト方法ですが、記述方法が分かりやすいところは大きなメリットですが、ドメインが変わる場合にしか使えない、というところが致命的な欠点です。
ドメインは変わらず、サイトの構造だけが変わった場合には使えないのです。
 
なぜなら、最後の 1行があるためにリダイレクトループしてしまうのです!
 
 
ドメインが変った場合であれば、別ドメインの環境にリダイレクトしてしまうためもう一度このリダイレクト処理が読み込まれることはありませんが、ドメインが同じ場合は、リダイレクトしてきた場合にまたこの .htaccessが読み込まれるため、トップページにリダイレクトした場合は延々とリダイレクトループしてしまう、という状況が発生してしまいます。
残念。
 
 
今回は「.htaccess」でリダイレクト処理をしていることが分かっていますので、リダイレクトループしてしまった場合の対処方法について確認する必要はありませんが、その他のリダイレクトループしてしまった場合などのために「リダイレクトループが原因で「ERR_TOO_MANY_REDIRECTS」「このページを表示できません」が出たときの対策12事例+α」に記事を書いていますので、何かでリダイレクトループしてしまった場合は参考にしてみてください。
 
 

.htaccessによるリダイレクトが利用できない場合

 
.htaccessによるリダイレクトですが、そもそも .htaccessが利用できるようになっていないと動きません。
 
.htaccessを使えるようにするための設定に関しては、下記のサイトが参考になります。
「httpd.conf」をメンテナンスできる環境の方は確認してみるといいでしょう。
 http://blog.sugulab.com/?p=816
 
 

.htaccessによるリダイレクトのまとめ

 
この記事では、Webサイトの更新、引越しなどでサイト構造が変わり、URLが変わったために旧 URLから新 URLにリダイレクトの設定をする、ということを想定してリダイレクトの処理を作成しました。
 
.htaccessに RewriteEngineの処理を記述することで、ドメインが変わる場合も変らない場合も両方対応できることを確認できました。
 
ここで例を出したものだけでは多様なリダイレクト処理を実行するには足りない箇所もありますが、.htaccessはプログラムを記述することと同じく、多様な処理を多様な記述方法で実現することができますので、ここでは条件を絞って解説をしました。
 
そのため、ここでの説明で足りない場合は、ググっていただいてマニュアル的なサイトを確認しつついろいろと試してみてください。

 - プログラミング・Web関連技術

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

借りてはいけないレンタルサーバ実例4社・アルファメール・WEBアリーナ

餅は餅屋。サーバはサーバ屋が提供するサービスを利用するべきという記事で、具体例 4サービスを例にこんなサーバはNGと紹介しています。

Pythonをコマンドラインで実行。全角文字(日本語)を引数にする場合の対処方法

Pythonをコマンドラインで実行する際、引数を付与して実行する方法の解説。その時問題となる日本語(全角文字)を利用する方法を解説。Windows環境での解説。

mod_pagespeedカスタマイズで高速化を詳細解説・Google謹製

mod_pagespeedをデフォルトのまま使っていませんか?mod_pagespeedはデフォルトのままでも速い!でも仕組みを理解し設定し直せばより速くなる!

Gitはフォルダ自体を管理対象にはできない。空のフォルダを設定する手順
Gitはフォルダ自体を管理対象にはできない。空のフォルダを設定する手順

Gitはフォルダだけを管理対象にすることはできない。そのため空の.gitkeepファイルを作成し管理対象にすることで、それが入っているフォルダも管理対象にする、と言う手順で管理を行う。

コピーコンテンツ・直リンクの3つの対策Google通報などのまとめ

コピーコンテンツを発見したときにやること!Googleに通報、画像の直リンクを禁止、RSSの全文配信を停止。この対策をしないとあなたのサイトの評価も下がるかも!

Beautiful Soupを利用してPythonでスクレイピングを行う環境構築方法の解説

BeautifulSoupはPythonでスクレイピングを行う際に便利なツール。インストール方法も簡単。ただ、事前にpipのインストールが必要でその解説もしてます。

PythonでUTF-8など日本語(全角文字)を使う方法。コメントにも必要。

Pythonの標準では日本語(全角文字)を利用できないので、利用する際は文字コードを宣言する必要がある。「# coding: utf-8」の様に記述すればOK。

ブラウザのキャッシュを活用するの対策!広告バナーを消して表示を高速化

あなたのサイトが遅いのはバリューコマースのバナーではないですか?バリューコマースのバナーを外すだけでmod_deflateとmod_expiresを設定するより効果があります!

FTPでダウンロード時にファイルが重複するため上書きしますか?と表示される問題

FTPでファイルをダウンロードする際に「ファイルが重複しています。上書きしますか?」というメッセージが出る場合がありますが、これの原因と対策、解決策の記事です。

.gitignoreを更新しても反映されないときは「git rm -r --cached .」でキャッシュを削除
.gitignoreを更新しても反映されないときは「git rm -r –cached .」でキャッシュを削除

gitの.gitignoreを変更しても記述内容が反映されない時がある。それはGitのキャッシュが残っているため。そんなときは「git rm」コマンドを使ってキャッシュを削除すれば解決する。