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