ページを移動した時や、ドメインに引っ越しの際にも色々便利な、htaccess。
そんな便利な記述だけど、実際リダイレクト先は色々なパターンがあるので、判った分だけ網羅しておきますね。
- 基本のリダイレクト・ドメイン正規化 www無し https
- index.html無しに統一
- ドメイン変更
- サブドメインからサブドメインなし
- サブドメインを別ドメインのディレクトリに移動
- ページを移動した・old.htmlからnew.html
- 別ページの途中に移動した・ページ内リンク
- ディレクトリ名が変わった
- ドメインも変わってページも移動した
- ディレクトリを丸ごとドメインに移動
- ディレクトリを丸ごと別ドメインのディレクトリに移動
- 指定したディレクトリ以外を飛ばしたい
- デバイスごとに飛ばしたい
- 追記:自分のIPだけ入れるようにしてメンテ画面にする
- 追記:指定したページを除外して飛ばしたい
初心者向け説明
念の為に最初に書いておきます。
簡単に書くと、リダイレクトとは、サーバーのURLにアクセスした時に、別なURLに飛ばす事です。
リダイレクトするには大抵の場合、htaccessというファイルを使います。
実際は「.(ドット)」がついいるので、「.htaccess」というファイル名で置かれる、中身はテキストファイルです。
大抵はサーバーの public_html フォルダの直下に置きます。
最初からある場合は、リダイレクトの内容をその下に書き足せば、リダイレクトします。
WordPressなどは、最初からありますが、その下に書き足す形ですね。
public_htmlの下位のディレクトリに置くこともできます。
下位のディレクトリに置いた場合は、その下のディレクトリのみリダイレクトされます。
1.基本のリダイレクト(ドメイン正規化 www無し https)
ErrorDocument 404 /404.html
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule ^(.*) http://domain.com/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
どういう事が書いてあるかというと
ErrorDocument 404 /404.html … 404の時、404,htmlページを表示する
RewriteEngine On … リライト機能をOnにする
RewriteCond %{HTTP_HOST} ^www\.domain\.com … wwwがついたURLを
RewriteRule ^(.*) http://domain.com/$1 [R=301,L] … www無しのURLに統一する
RewriteCond %{HTTPS} off … httpsではない場合に
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] … httpsをつける
以下からは、RewriteEngine on を略していますので、先に
RewriteEngine on
をつけてくださいね。
2.index.html無しに統一
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://domain.com/$1 [L,R=301]
3.ドメイン変更
RewriteRule ^(.*) https://new-domain.com/$1 [R=301,L]
上のテキストを移動前のサーバーの.htaccessに書いてください
4.サブドメインからサブドメインなし
RewriteCond %{HTTP_HOST} ^sub\.domain\.com$
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]
5.サブドメインを別ドメインのディレクトリに移動
RewriteCond %{HTTP_HOST} ^sub\.domain\.com
RewriteRule ^(.*) https://newdomain.com/subdirectory/$1 [R=301,L]
6.ページを移動した・old.htmlからnew.html
RewriteEngine on
RewriteRule ^old.html$ /new.html [R=301,L]
よくあるやつです、old.htmlがnew.htmlに引っ越します
7.別ページの途中に移動した・ページ内リンク
RewriteRule ^/old.html /new.html#anchor [NE,R=301,L]
これは使う事ありそうで、ないような?小さいページを一つにまとめた時とか?
ページ内リンク先#anchorに移動します
通常は[R=301,L] だけど[NE,R=301,L]と書く
NEはエンコードさせないための指示です
8.ディレクトリ名が変わった
RewriteRule ^directoryold(.*)$ /directorynew$1 [R=301,L]
domain.com/directoryold/ から domain.com/directorynew/ になった時
9.ドメインも変わってページも移動した
RewriteRule https://olddomain.com/old/old.html
https://newdomain.com/new/new.html [R=301,L]
10.ディレクトリを丸ごとドメインに移動
RewriteRule ^olddirectory$ https://newdomain.com [R=301,L]
…/olddirectory/ を https://newdomain.com/ に移動
11.ディレクトリを丸ごと別ドメインのディレクトリに移動
RewriteRule ^olddirectory$ https://newdomain.com/newdirectory/ [R=301,L]
…/olddirectory/ を https://newdomain.com/newdirectory/ に移動
12.指定したディレクトリ以外を飛ばしたい
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/tobasanaide/)
RewriteRule ^(.*)$ https://domain.com/ [R=301,L]
13.デバイスごとに飛ばしたい
RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)$ sp/$1 [R]
RewriteBase /
RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^sp/(.*)$ $1 [R]
RewriteBase /
HTTP_USER_AGENTで指定したデバイスを、ドメイン直下の/sp/に飛ばす
デバイス振り分けは最近レスポンシブばかりで忘れていました。
以下を参考にしています。
htaccessによるデバイス振り分け #htaccess - Qiita
そういえば、このリダイレクト、最近のWordPressでは、Redirectionという便利なプラグインがあるらしく、それで設定もできるらしい。
…でも、今まで私が設定したものは、HTML→WordPressとか、既存サイトディレクトリ→オンラインショップURLとか、MT→WPとか、WordPressから飛ばす事なかったので、あまり意味ないような気がします。
という事で
アレ?どうだったっけ?
既存サイトを見て、こうだったかー!
とかやりがちなので、これでなんとかなるはずさー。
自分のIPだけ入れるようにしてメンテ画面にする
最近あまり使わないので忘れていました。
下記のブログを参考にしてください。役立つ度★★★★★
メンテナンス画面を出すための.htaccessの書き方 | クロジカ
以下のブログは、複雑なリダイレクト方法も書かれています。役立つ度★★★★★
.htaccessによる少し複雑なリダイレクト備忘録 - Fly higher! Sky is the limit!
指定したページを除外して飛ばしたい
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai01.html)
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai02.html)
RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]
上記は
/subdirectory/tobasanai01.html
/subdirectory/tobasanai02.html
以外を https://newdomain.com/にとばします。
指定したディレクトリ以外を飛ばしたいの時と同じく、.htmlの場所を書けばよいです。
参考サイト
【apache】特定のディレクトリを除外してリダイレクトしたい at softelメモ
複数のページやディレクトリを順番に書けば、それが除外されます。
RewriteCond %{REQUEST_URI} !(^/subdirectory/tobasanai01.html)
の「!」が除外の時の指示です。
リダイレクトなどの指示は上から順番に行われていきます。
なので、おかしくなった時は、そのどれかが間違っているか、一行づつ確かめてみるとよいです。
処理には優先順位が指定できたりしまます。
それでハマる事もありました。
詳しくは、以下のサイトが参照になりましたよ。
【WordPress】特定ページ以外のアクセスを別ドメインのサイトにリダイレクトさせる | 電脳備忘録 | 560Days.com
コメント
トラックバックURL