Webサイト公開後、.htaccessを使って旧ページから新ページにリダイレクトをかけます。何度も同じようなことをしているのですが、やはり忘れっぽいので、よく使うリダイレクトの書き方をまとめておきます。
私と同じような誰かのお役に立てれば幸いです。
私がよく使うリダイレクトは301リダイレクトのため、この記事のコードは全て301リダイレクトとなっています。302リダイレクトを用いる場合は、適宜変更してください。
また、上手く動作しない場合のパターンも挙げてみましたので、上手く動作しない方は参考にしてください。
.htaccessでリダイレクトが動かない、動作しない場合のよくあるパターン
そもそも「.htaccess」って何?という方もいらっしゃると思います。
「.htaccess」とは、「どっと えいち てぃー あくせす」と読みます。Webサーバの挙動をディレクトリ単位で制御することができるファイルです。
アクセス制限をかけたり、ページの表示にパスワードを要求したり、あるページへのアクセスを別のページヘリダイレクト(転送)させたりすることができます。
今回この記事では、リダイレクトについてまとめます。
.htaccessを利用するためには、そのサーバ内に「Apache」がインストールされている必要があります。そちらについての詳しい説明は、今回は割愛します。
.htaccessのリダイレクトの基本的な形は以下のようなものになります。
1行目は、Rewrite機能をONにするという意味です。
URLの書き換えを可能にする処理です。
たまに、RewriteRuleのあとに「RewriteEngine on」と都度書いている.htaccessファイルがありますが、一度Rewrite機能をONにすれば良いので、ひとつの.htaccessファイル上で何度も書く必要はないと思います。
2行目は、URL書き換えのベースになるURLを示します。
「RewriteBase /」は、.htaccessが設置されたディレクトリを基準にします。
3行目がURLの書き換えを指示する内容となります。
転送元ファイル.htmlを、http://転送先URLにリダイレクトします。
最終行は必ず改行してください。
.(ドット)からはじまるファイル名の保存ができない環境の方もいらっしゃると思います。
そういった場合は、「htaccess.txt」や「a.htaccess」等、ローカル上では保存が可能なファイル名にしておき、サーバにアップロード後「.htaccess」としてリネームしてください。
.htaccessは設置したディレクトリ以下に影響を及ぼします。
設置したディレクトリにのみ影響を与えるわけではないので注意してください。
上記の図のように、設置したディレクトリの子ディレクトリにも影響を与えます。
RewriteEngine on RewriteBase / RewriteRule 転送元ファイル\.html http://転送先URL [R=301,L]
転送先にファイル名を引き継がず、固定のURLに転送したい場合です。
RewriteEngine on RewriteBase / RewriteRule ^ディレクトリ名/(.*)$ http://転送先URL [R=301,L]
転送先にファイル名を引き継ぎ、同じファイル名として別ディレクトリに転送したい場合です。
RewriteEngine on RewriteBase / RewriteRule ^ディレクトリ名/(.*)$ http://転送先URL/転送先ディレクトリ名/$1 [R=301,L]
似たようなファイル名がずらっと並んでいることがあります。そういったファイル名をまとめてリダイレクトします。
例えば、以下のような名前のついたファイルがあるとします。
20140101123456789.html
20140102134679852.html
20140103316497258.html
20140104987654321.html
…
上記のファイル名は全て、「2014」からはじまっていますので、ファイル名に「2014」がつく「htmlファイル」を判別してリダイレクトします。
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} 2014(.*)\.html RewriteRule ^(.*)$ http://転送先URL [R=301,L]
あるディレクトリだけ、リダイレクトから除外したい場合に使います。例えば、.htaccessを設置したディレクトリ内に、別ドメイン用のディレクトリが存在している場合に使います。
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !(^/除外ディレクトリ名/) RewriteRule ^$ 転送先URL [R=301,L]
また、除外したいディレクトリに対し、以下のコードが書かれた.htaccessを設置する方法もあります。
RewriteEngine off
例えば、画像ファイルはリダイレクトから除外したい場合に使います。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.*)\.(除外したいファイルの拡張子|除外したいファイルの拡張子2)$ [NC] RewriteRule 転送元URL 転送先URL [R=301,L]
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg|css)$ [NC] RewriteRule ^(.*)$ http://転送先URL/転送先ディレクトリ名/ [R=301,L]
wwwなしURLを、wwwありURLにリダイレクト、またその逆の処理を行います。
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.ドメイン名\.com RewriteRule ^(.*)$ http://ドメイン名/$1 [R=301,L]
RewriteEngine on RewriteCond %{HTTP_HOST} ^ドメイン名\.com RewriteRule ^(.*)$ http://www.ドメイン名/$1 [R=301,L]
.htaccessをサーバに設置したけれど、リダイレクトが動かない!ということがあります。
そういった場合は、以下をチェックしてみてください。
書き方に誤りがあり、動作しない場合があります。
以下の項目をチェックしてみてください。
また、レンタルサーバによっては、独自の書き方をしなければならないサーバも存在します。
ユーザマニュアルなどに詳細が書かれている可能性がありますので、確認してみてください。
.htaccessの文字コード・改行コードが文字コード:UTF-8、改行コード:LF(UNIX)になっていることを確認してください。
.htaccessのパーミッションが「604」になっていないと動作しないことがあります。
レンタルサーバによって、「644」が推奨されていることもあります。
ユーザマニュアルなどに詳細が書かれている可能性がありますので、確認してみてください。
リダイレクトを施したいディレクトリに.htaccessが置かれていますか?
ひとつ上の階層や、ひとつ下の階層に設置してしまっており、上手く動作しないということがあります。
設置したディレクトリが正しいかどうかを確認してください。
.htaccessを設置することができるサーバでも、.htaccessの機能を制限されている可能性があります。
今回ご紹介しているリダイレクトには、mod_rewriteというサーバのモジュールを使っています。
このmod_rewriteが動作しないサーバでは、リダイレクト処理を行うことができません。
サーバの情報などが把握できていれば良いのですが、場合によっては把握できないこともあります。
その際、mod_rewriteが使えるのかを判断するため、私は以下のコードを用いて確認します。
<IfModule mod_rewrite.c> ErrorDocument 404 http://www.google.com/ </IfModule>
上記のコードを.htaccessに書き込み、存在しないファイルにアクセスします。
その後、Googleにリダイレクトされれば、mod_rewriteが使えます。
お使いのサーバでは、.htaccessの設置が許可されていないかもしれません。
サーバ会社に問い合わせたり、マニュアルをご確認ください。
以前は、.htaccess?何に使うの?と思っていましたが、今ではとても便利だなと思います。
上記にご紹介した他にも、「これよく使うよ」「動かないとき、こういうことがよくあるよ」ということがございましたら、教えていただけますと幸いです。