エス技研

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.

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

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

  関連記事

Gitで基本的なデプロイ(push、pullで本番公開)環境を作る手順解説
Gitで基本的なデプロイ(push、pullで本番公開)環境を作る手順解説

開発進行中の環境、公開中の環境にGitを導入する。その基本的な手続きを解説。Gitの導入、ローカルリポジトリを作成。リモートリポジトリを利用し、本番環境にデプロイする手続きを解説。

Selenium WebDriverでFirefoxをプライベートウィンドウ/Chromeをシークレットモードで起動する方法・言語はpython

Seleniumでは初期状態でブラウザを起動する   Seleniumでブラウザ …

Selenium WebDriver、Pythonをインストールしブラウザ自動操作の環境構築手順のまとめ

ブラウザを自動操作しテストを実行するロボットをselenium WebDriver+Pythonの環境を構築し、動作確認までの手順のまとめ。初心者向けに詳細解説。サンプルソースも。

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

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

ロリポップからX-Serverに引越し。サーバの月額費用が増えても求めた理由は?

ロリポップからX-Serverに引越すその理由とは?SEOの観点からも少しでもサーバレスポンスが早いサーバが求められロリポップでは限界を感じたからです。

chromedriver.exe - ディスクがありませんと出てSeleniumの設定が上手くいかない
chromedriver.exe – ディスクがありませんと出てSeleniumの設定が上手くいかない

Selenium WebDriverを使ってChromeを自動操作する仕組みを作る際、chromedriver.exeを利用しますが、ディスクがありません、というエラーが発生する場合があります。その対処方法を解説します。

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

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

さくらサーバのmb_send_mailでメール送信時にmalformed header from script 'xxx.php': Bad header: xxxのエラーが
さくらサーバのmb_send_mailでメール送信時にmalformed header from script ‘xxx.php’: Bad header: xxxのエラーが

さくらインターネットのレンタルサーバからPHPのmb_send_mail()関数を利用してメールを送信するとInternal Server Errorが発生。その原因は、メールアドレスが登録されていないこと。

コピーコンテンツ対策.htaccessで直リンク禁止しリダイレクトで対応

不正なコピーコンテンツからの直リンクを拒否する.htaccessの設定方法。拒否するサイトを指定、許可するサイトを指定する方法、単純な拒否と画像の差し替えを解説。

直リンク禁止の.htaccessを超分かりやすく解説。日本語じゃなくてPHPで説明

直リンクを禁止する.htaccessの記述内容を日本語ではなくPHPで解説!私自身もこの方法ですっかり理解できました。.htaccessって簡単!って思えますよ。