【WebServer】「.htaccess」設定で「指定URL」を「リダイレクト」させる方法

【WebServer】
「.htaccess」設定で「指定URL」を「リダイレクト」させる方法




「.htaccess」設定で、
「リダイレクト」させる方法をまとめています。


「Webサーバー」では、「.htaccess」ファイルを設定することで、
指定の「IPアドレス」「URL」「ディレクトリ」「ファイル」へのリクエストを 他のページに「リダイレクト(振り返る)」ことができる。


詳しくは、
下記をご参照ください。



INDEX


「リダイレクト」とは
「.htaccess」を使っての「リダイレクト」
「リダイレクト」させる書式
「.htaccess」ファイルで使える「正規表現」
「.htaccess」ファイルで使える「サーバ変数」

「リダイレクト」の種類

「新ドメイン」に「リダイレクト」させる書式
別「ディレクトリ」に「リダイレクト」させる書式
別「ファイル」に「リダイレクト」させる書式
「URL」の大部分変更した「リダイレクト」をさせる書式
「リダイレクト」から特定の「ディレクトリ」を除外する書式
「www」の有無を指定して統一する「リダイレクト」の書式
「http」を「https」にリダイレクトさせる書式
「特定IPアドレス」を「.htaccess」ファイル設定でリダイレクトさせる方法
「デバイス」による振り分けをするリダイレクトの書式

「リダイレクト」とは


「リダイレクト」とは、
リクエストしてもらった「URL」とは、
別の「URL」のページに転送することを言います。
複数の「URL」リクエストを「リダイレクト」することによって、
転送先を1つに絞ることができる。



「リダイレクト」によって、

・「旧URL」からのアクセスを受け入れられる
・「旧URL」の「Google評価」を継承できる
・「www」の有無や「http」「https」など「URL」の統一が可能
・「URL」末尾の表記「/」「/index.html」を統一することが可能

などの効果が期待できます。


Back

「リダイレクト」とは


「.htaccess」ファイルに記述することにより、
リクエスト「URL」とは別の「URL」に転送する「リダイレクト設定」をすることができます。

リダイレクトの設定は、
・サーバー設定ファイル「httpd.conf」
・「.htaccess」ファイル
のどちらかに記述することになっていますが、
「サーバー設定ファイル(httpd.conf)」には、「管理者」しか「リダイレクト設定」を記述できないので、
レンタルサーバーなどでは、 基本的に「.htaccess」ファイルに「リダイレクト設定」を記述するようになっています。


「.htaccess」ファイルでは、
「リダイレクト」の他に「アクセス許可・拒否」「アクセス認証」などの設定もできるようになっています。


「.htaccess」ファイルに記述する「リダイレクト設定」は、
「Apache」の「mod_rewrite(URL書き換えエンジン)」拡張モジュールを使用し、
「正規表現」を使用して書き換え設定を記述する。
リクエストされた「URL」が実存しなくても、
「.htaccess」ファイルに、「リダイレクト設定」が記述されていれば、
指定の「URL」に転送されるようになります。

「サーバー設定ファイル(httpd.conf)」への記述の方が、
「.htaccess」ファイルの記述によるリダイレクトより早いので、
「管理者」は、「サーバー設定ファイル(httpd.conf)」への記述が推奨される。


Back

「リダイレクト」させる書式


「.htaccess」ファイルに「リダイレクト」設定を記述するには、
拡張モジュール「mod_rewrite(URL書き換えエンジン)」の書式にしたがって記述する必要がある。


「検索サイト」への反映は、おおよそ「1週間~1ヶ月」ほど時間が必要。


拡張モジュール「mod_rewrite(URL書き換えエンジン)」の書式

「.htaccess」ファイル設定の注意点は、

■ 正規表現の特殊文字が含まれる場合は、「逆スラッシュ(日本語環境では "\")」でエスケープする。
■ サーバーによっては、最後に「RewriteEngine off」を記述しない方が、正常に動く場合がある。
■ 「RewriteBase /ディレクトリ名/」を指定すると、「RewriteEngine off」を指定するまで、「/ディレクトリ名/」以後のURLパスの記述だけで「OK」。

などがあります。



「.htaccess」ファイルを「ドキュメントルート」の直下に置いた場合

RewriteEngine on
RewriteBase /

# ドメインの統一
RewriteCond %{HTTP_HOST} ^ドメイン名.com [NC]
RewriteRule ^(.*)$ http://www.ドメイン名.com/$1 [R=301,L]

# ファイルの移転
RewriteRule ^ディレクトリ名\/index\.html$ /新ディレクトリ名/index.html [R=301,L]

# ディレクトリの移転
RewriteRule ^ディレクトリ名\/(.*)$ /新ディレクトリ名/$1 [R=301,L]

# クローラのアクセス禁止
RewriteCond %{HTTP_USER_AGENT} Badbot-1 [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Badbot-2 [NC]
RewriteRule !^robots\.txt$ - [F,L]

RewriteEngine off


「.htaccess」ファイルを「サブディレクトリ」に置いた場合

RewriteEngine on
RewriteBase /ディレクトリ名/

# ファイルの移転
RewriteRule ^old_dir\/index\.html$ new_dir/index.html [R=301,L]

# ディレクトリの移転
RewriteRule ^old_dir\/(.*)$ new_dir/$1 [R=301,L]



ドメインの統一

ドメインを「ドメイン名.com」「www.ドメイン名.com」という表記のどちらかに統一する設定。

RewriteCond %{HTTP_HOST} ^ドメイン名.com [NC]
RewriteRule ^(.*)$ http://www.ドメイン名.com/$1 [R=301,L]

「^(.*)$」は、行頭から行末までの全ての文字列という意味の「正規表現」


ファイルの移転

リクエストに対して、ファイルが移転したことを通知する書式。

RewriteRule ^ディレクトリ名\/index\.html$ /新ディレクトリ名/index.html [R=301,L]


ディレクトリの移転

ディレクトリ全体が移転したことを通知する設定。

# 内部移転
RewriteRule ^ディレクトリ名\/(.*)$ /新ディレクトリ名$1 [R=301,L]
# 外部移転
RewriteRule ^ディレクトリ名\/(.*)$ http://www.ドメイン名/新ディレクトリ名/$1 [R=301,L]


拡張子の変更

# 特定のファイルの拡張子 ".php"を、".html" に変更する
RewriteRule ^ファイル名\.php$ /ファイル名.html [R=301,L]
# 拡張子が ".php" のファイルを、全て ".html" に変更する
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]
# 特定のディレクトリに対して、全てのファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} ^/ディレクトリ名/
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]
# 特定のディレクトリを除いて、全てのファイルの拡張子を変更する
RewriteCond %{REQUEST_URI} !^/ディレクトリ名/
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]


ドメイン変更

新しいドメインへリダイレクトを設定。
HTTPステータスコード [R=301](Moved Permanently) により、「URL」が永久に移動したことを通知。
この処理で、旧サイトの「ページランク」を、自動的にほぼ引き継ぐことが可能になる。

RewriteRule ^(.*)$ http://www.新ドメイン名.com.com/$1 [R=301,L]


ファイルの消去

「ファイル」「ディレクトリ」が削除されたことをクローラに通知。

# ファイルの消去
RewriteRule ^ディレクトリ名\/ファイル名\.html$ - [G]
# ディレクトリの消去
RewriteRule ^ディレクトリ名\/(.*)$ - [G]


アクセス制限

「サーバ変数」を取得して、アクセス制限を設定できる。
[F] は、「Forbidden(アクセス禁止)」を意味する。

RewriteCond %{HTTP_REFERER}
RewriteRule ^.* - [F]


直リンクを全て禁止する

RewriteCond %{HTTP_REFERER} !ドメイン名.com [NC]
RewriteRule ^.* - [F,L]


外部からの画像や動画への直リンクを禁止する

「Referer」が "ドメイン名.com" を含まないリクエストに対して、拡張子が ".jpg", ".png", ".gif", "mp4", "swf" への直リンクを禁止する設定。

RewriteCond %{HTTP_REFERER} !ドメイン名.com [NC] RewriteRule \.(jpg|png|gif|flv|mp4)$ - [F,L]

特定の検索ロボット(クローラ)に対して、"robots.txt" 以外のアクセスを禁止する

RewriteCond %{HTTP_USER_AGENT} Badbot-1 [NC,OR] RewriteCond %{HTTP_USER_AGENT} Badbot-2 [NC,OR] RewriteCond %{HTTP_USER_AGENT} Badbot-3 [NC,OR] RewriteCond %{HTTP_USER_AGENT} Badbot-n [NC] RewriteRule !^robots\.txt$ - [F,L]


ディレクティブと書式初期値説明
RewriteEngine on/offoff書き換えの可否を設定。
RewriteOptions inherit-現在の設定値を「親ディレクトリ」の設定値から強制的に継承するオプション設定
RewriteBase / /書き換えのベースとなるパス。ベースが明白な場合は不要。
RewriteCond テスト文字列 パターン-テスト文字列とパターンを比較。
RewriteRule パターン 置換対象-パターンに合致した文字列を置換対象に書き換え。



オプション

書式説明
C Chain
マッチしたら、次のルールを評価
END(END) リライト処理停止。
「END」の場合は「.htaccess」単位で終了する。
[F] Forbidden.
強制的にアクセス禁止にする。
HTTPレスポンス「403 : Forbidden」を返す。
[G] Gone.
強制的に消去済みにする。
HTTPレスポンス「410 : Gone」を返す。
存在しないページを消去済みとしてマークする方法。
[L] Last.
マッチしたらRewriteをストップする。
以降のルールは無視して、実行しない。
[NC] No Case.
パターンにおいて、文字の大小を区別しない。
「A-Z」「a-z」を区別しない。
[NE] No Escape
「.」「,」「?」「%」などの特殊文字がエンコードされるのを防ぐ。
[OR][AND] Or / And
複数の比較条件を行う。
指定しないで複数指定すると「AND」。
[P] Proxy
ルールに一致したリクエストをプロキシを介して処理するオプション。
一致した場合は、以降の処理は無視され実行されない。
[PT] Path Through
「Rewrite」を終了し、「Rewrite」以外の処理に移行・実行。
[QSA] Query String Append
移転元が保有していたクエリ文字を引数として引き継ぐ
[R] Redirect.
強制的にリダイレクトする。
[R=301] 永久的に移動。
HTTPレスポンス「301 : Moved Permanently」を返す。
[R=302] 一時的な移動。
デフォルトの設定。
HTTPレスポンス「302 : Moved Temporarily」を返す。


Back

「.htaccess」ファイルで使える「正規表現」


「正規表現」は、
規則性のある複数の「URL」「IPアドレス」を指定するのに便利なツール。
使用に慣れると、あらゆる状況にあった指定が記述できる。
文字説明
!否定。
.任意の1文字。
[]括弧内のいずれかの文字。
[^]括弧内のいずれかの文字以外。
|または。
?直前の文字の0回または1回の繰り返し
*直前の文字の0回以上の繰り返し。
+直前の文字の1回以上の繰り返し。
()選択範囲の境界を明示する、もしくは後方参照を作成する。
^行頭
\$行末
\$n(0 <= n ≤= 9) 後方参照。n番目の()内の値が入ります。
%{}サーバ変数の取得。
\逆スラッシュ(日本語環境では円マーク)。パターン内で正規表現の特殊文字をエスケープする。
<左より上
>右より下
=両サイドが等しい
<=左以上
>=右以下
-dディレクトリが存在する
-fファイルが存在する
-eq「=」イコールと同意
-ge「<=」以上と同意
-gt「<」より上と同意
-le「>=」以下と同意
-lt「>」未満と同意


Back

「.htaccess」ファイルで使える「サーバ変数」


「サーバ変数」は、

・リクエストされた「URL」
・サーバー情報
・Web情報
・ブラウザ情報
・IPアドレス
・ユーザー情報
・リクエスト時間

などの情報が、全部・部分的に保存されている「変数」で、
「URL」では、「ドメイン名」「URI」「クエリ情報」などに分割して保存している。
「リダイレクト」設定を記述するときに、
「ドメイン名」だけ変更したアドレスに「リダイレクト」させる時は、 「URI」「クエリ情報」の「サーバ変数」を指定すれば、複数のURLを1つの記述にまとめることができる。



変数名説明
HTTP_USER_AGENTブラウザの種類とバージョン。
HTTP_REFERER参照元の URL 。
HTTP_COOKIE設定されているクッキー情報。
HTTP_FORWARDEDプロキシサーバ情報。
HTTP_HOST接続要求しているホスト名。
HTTP_PROXY_CONNECTION接続先プロキシサーバとの接続状態。
HTTP_ACCEPTブラウザが認識可能なデータ形式。
DOCUMENT_ROOTサイトのルートディレクトリ。
SERVER_ADMINサーバ管理者のメールアドレス情報。
SERVER_NAMEサーバのホスト名、ドメイン名、またはIPアドレス情報。
SERVER_ADDRサーバのIPアドレス。
SERVER_PORT送信に使われたサーバのポート番号。
SERVER_PROTOCOL送信に使われたプロトコルの名前とレビジョン情報。
SERVER_SOFTWARE起動したサーバソフトウエアの名前とバージョン情報。
REMOTE_ADDRリモートホストのIPアドレス情報。
REMOTE_HOSTリモートホストのドメイン名。
REMOTE_USERユーザの認証名。
REMOTE_IDENTリモートホストのユーザ名。
REQUEST_METHODリクエストを送信した方法。
REQUEST_URIリクエストされたURI。
SCRIPT_FILENAME現在実行しているスクリプト名。
PATH_INFOクライアントから送られるパス情報。
QUERY_STRINGURL に付加して渡された "?" 以降の文字列。
AUTH_TYPEユーザを認証するときに使用する認証方法。
TIME_YEARサーバのシステム日付・年
TIME_MONサーバのシステム日付・月
TIME_DAYサーバのシステム日付・日
TIME_HOURサーバのシステム日付・時
TIME_MINサーバのシステム日付・分
TIME_SECサーバのシステム日付・秒
TIME_WDAYサーバのシステム日付・曜日
TIMEサーバのシステム日付・Unix タイムスタンプ。


Back

「リダイレクト」の種類


「リダイレクト」には、いくつか種類があります。
良く利用される「リダイレクト」は、

「301」の「恒久的」に「リダイレクト」させるもの
「302」の「一時的」に「リダイレクト」させるもの

の2つ。


「Webサーバー」と「ブラウザ」の間では、 「3桁」の番号を送受信し、交信処理を行っていて、 その番号は「100~510」までの数字を使用しています。

「リダイレクト」で使われる数字は、 「301」「302」「303」「307」があります。



コード説明
301 「Moved Permanently」
「恒久的」なリダイレクトを意味する
302 「Found」
「一時的」なリダイレクトを意味する
303 「See Other」
「GET」メソッドに変換されるリダイレクト。
「POST」メソッドでアクセスしても、「GET」メソッドでのアクセスに変換されるという「リダイレクト」らしい。
307 「Temporary Redirect」
「302」に似ている「リダイレクト」。
一時的に別の「URL」に「リダイレクト」させるの一緒だが、
「307」は、同一メソッドで「リダイレクト」をする。


Back

「新ドメイン」に「リダイレクト」させる書式


「ドメイン名」を新しくしたときに必要な「リダイレクト」の設定。
古いドメインへのアクセスは、検索エンジンなどに登録されていると、 最長で1年ほど続くこともあるそうです。
新しいドメインへと転送設定をしていれば、 古いドメインへのアクセスも逃すことがなくなります。


その1

RewriteEngine On
Redirect permanent / https://www.new.com/


その2

RewriteEngine On
RewriteCond %{http_host} ^www.旧ドメイン名.com
RewriteRule ^(.*) https://www.新ドメイン名.com/$1 [R=301,L]


Back

別「ディレクトリ」に「リダイレクト」させる書式


「ディレクトリ名」を変更した時に便利な「リダイレクト」設定。
もともとあるWebページの保存ディレクトリを変更した時に、
「リダイレクト」を設定しておくと、旧ディレクトリへのアクセスも転送できます。


RewriteEngine on
RewriteRule ^旧ディレクトリ名(.*)$ /新ディレクトリ名$1 [R=301,L]
RewriteRule ^OldDirName(.*)$ /NewDirName$1 [R=301,L]


Back

別「ファイル」に「リダイレクト」させる書式


Webページごとに「リダイレクト」を指定することも可能。
人気のページを更新したときに、ファイル名も変更した場合に、 指定しておくと良い設定。


RewriteEngine on
RewriteRule ^旧ファイル名.html$ /新ファイル名.html [R=301,L]
RewriteRule ^OldFileName.html$ /NewFileName.html [R=301,L]


Back

「URL」の大部分変更した「リダイレクト」をさせる書式


「URL」の「ドメイン名」「ディレクトリ名」「ファイル名」など大部分を変更した時に便利な「リダイレクト」設定。
Webをリニューアルした時には、この方法の記述を多くすることになる。


その1

RewriteEngine on
RewriteRule https://www.旧ドメイン名.com/旧ディレクトリ名/旧ファイル名.html https://www.新ドメイン名.com/新ディレクトリ名/新ファイル名.html [R=301,L]
RewriteRule https://www.OldDomainName.com/OldDirName/OldFileName.html https://www.NewDomain.com/NewDirName/NewFileName.html [R=301,L]


その2

RewirteEngine on
Redirect permanent https://www.旧ドメイン名.com/旧ディレクトリ名/旧ファイル名.html https://www.新ドメイン名.com/新ディレクトリ名/新ファイル名.html
Redirect permanent https://www.OldDomainName.com/OldDirName/OldFileName.html https://www.NewDomain.com/NewDirName/NewFileName.html


Back


特定の「ディレクトリ」だけ「リダイレクト」しないように設定することもできる。
一括設定したときに、特定部分だけ除外することも可能なので、 この方法は覚えておくと良い。


「リダイレクト」から特定の「ディレクトリ」を除外する書式

RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !(^/除外したいディレクトリ名/) RewriteCond %{REQUEST_URI} !(^/DirName/) RewriteRule ^$ http:www.ドメイン名.com [R=301,L]


Back

「www」の有無を指定して統一する「リダイレクト」の書式


「www」の表示を統一するための「リダイレクト」。
どちらにアクセスしても、指定した「www」表記に「リダイレクト」してくれる設定なので、
一番使われている「リダイレクト」の一つかもしれません。



「www」あり
RewriteEngine on RewriteCond %{HTTP_HOST} ^aaa\.com$ RewriteRule ^(.*)$ https://www.aaa.com/$1 [R=301,L]


「www」なし
RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.aaa\.com$ RewriteRule ^(.*)$ https://aaa.com/$1 [R=301,L]


Back

「URL」の最後を統一する「リダイレクト」の書式


「ドメイン」や「ディレクトリ」にアクセスしたときの「URL」表記を指定する「リダイレクト」設定。
「/index.html」「/」「なし」の3通りを指定できる。



「/」で終わるhtaccess
RewriteEngine on RewriteCond %{THE_REQUEST} ^.*/index.html RewriteRule ^(.*)index.html$ https://domein.com/$1 [R=301,L]


最後を「index.html」で統一する方法
RewriteEngine on RewriteRule ^$ /index.html [R=301,L]


Back

「http」を「https」にリダイレクトさせる書式


「SSL」を導入して、「https」でのアクセスを可能にしても、
浸透するまでは、「http」でアクセスされることが、ほとんどになります。
「https」導入直後に、「http」アクセスを「https」アクセスにリダイレクトさせるための設定です。



RewriteEngine on RewriteCond %{ HTTPS} off RewriteRule ^(.*)$ https://%{ HTTP_HOST}%{REQUEST_URI} [R=301,L]


Back

「特定IPアドレス」を「.htaccess」ファイル設定でリダイレクトさせる方法


「IPアドレス」によって、「リダイレクト」を指定することも設定可能。
特定の「IPアドレス」だけ「リダイレクト」させたい時などに使用する設定。



指定IP以外からのアクセスをリダイレクトさせるコード

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.254$
RewriteRule .* http://www.sample.com/ [R=302,L]


指定IPからのアクセスをリダイレクトさせるコード
RewriteEngine on
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.254$
RewriteRule .* http://www.sample.com/ [R=302,L]

「!」マークをつけると指定IP以外を指定してリダイレクトさせる。
「!」マークをつけないと指定IPを指定してリダイレクトさせる。



リダイレクトの構文
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !【対象のIPアドレス】
RewriteRule 【対象のディレクトリ】 【転送先のURL】 [R=302,L]



コード解説
RewriteEngine onリダイレクトを「ON」「OFF」するコード。
RewriteCond %{REMOTE_ADDR} !【対象のIPアドレス】「REMOTE_ADDR」でIPで指定することを宣言。対象アドレス以外を指定する場合「!」を記述。対象アドレスを指定する場合「!」を記述しない。
RewriteRule 【対象のディレクトリ】 【転送先のURL】 [R=302,L] どのディレクトリへのアクセスをどのURLに転送するかを指定する場所。「.*」で全てのディレクトリを対象ディレクトリに指定。


Back

「デバイス」による振り分けをするリダイレクトの書式


「スマートフォン」「iPhone」などのデバイスだった場合に、「リダイレクト」させる設定。
「スマートフォン」専用サイトと通常サイトを所有している場合は、必須の「リダイレクト」設定。


RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|Android.*Mobile|Windows.\ Phone)
RewriteRule ^(.*)$ sp/$1 [R]

RewriteCond %{REQUEST_URI} /sp/
RewriteCond %{HTTP_USER_AGENT} !(iPod|iPhone|Android.*Mobile|Windows.\ Phone)
RewriteRule ^sp/(.*)$ $1 [R]


Back