いざ使う時忘れてる!.htaccessを使ったリダイレクト設定

htaccess
Update 2018.04.26

301リダイレクトをする前に

使用するサーバーが以下に当てはまるか確認してください

  • .htaccessが使えるサーバー
  • Apacheを使っている
  • 「mod_Rewrite」をサポートしているサーバー

よく使うHTTPステータスコードの種類とhtaccessの書き方

HTTPステータスコードの種類

100番台:リクエスト処理中
200番台:リクエスト処理成功
300番台:リダイレクト処理
400番台:クライアントエラー
500番台:サーバーエラー
今回は300番台:リダイレクト処理についてです。

htaccessでリダイレクトさせる基本的な書き方

RewriteEngine on・・・URLの書き換えを許可
RewriteBase /・・・URL書き換えのベースになるURLを指定
RewriteRule・・・URL書き換え内容を指示
空改行・・・.htaccessの最後の行は必ず改行

*「.htaccess」のパーミッション(属性)は「604」に。
*htaccess.txtというファイルを作成して編集、ftpサーバにアップしたあとで「.htaccess」にリネームする。
*「.」で始まるファイルは隠しファイルになってしまうので、「隠しファイルを表示」して編集でも可能。

処理を間違えると ページが見れなくなるなど大きな問題となります。
必ず技術の分かる人にご確認の上一緒に対応を行うようにしてください。

browser: 

301・・・恒久的な移動(転送)

検索エンジンに対してドメインやURLの変更を知らせる(サイト移転時などに)
古いサイトの情報が新しいサイトに引き継がれる

ページ単位のリダイレクト

ニャン易度
ページ単位のリダイレクト
RewriteEngine on
RewriteBase /
RewriteRule  転送元ファイル名.html$ http://転送先URL/転送先ファイル名.html [R=301,L]

ディレクトリ単位のリダイレクト

ニャン易度
ディレクトリ単位のリダイレクト
RewriteEngine on
RewriteBase /
RewriteRule ^転送元ディレクトリ名/(.*)$ http://転送先URL/転送先ディレクトリ名/$1 [R=301,L]

ドメイン単位のリダイレクト

ニャン易度
ドメイン単位のリダイレクト
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www.転送元URL)(:80)? [NC]
RewriteRule ^(.*) http://www.転送先URL/$1 [R=301,L]

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

ニャン易度
特定のディレクトリをリダイレクトから除外する
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/除外ディレクトリ名/)
RewriteRule ^$ http://www.転送先URL/ [R=301,L]

上位ディレクトリがhttpsへリダイレクトされるときサブディレクトリを除外する

ニャン易度
上位ディレクトリがhttpsへリダイレクトされるときサブディレクトリを除外する
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ドメイン名\.com
RewriteRule ^(.*) http://サブドメイン名.ドメイン名/$1 [R=301,L]

www無しのURLに統一(URLの正規化)

ニャン易度
www無しのURLに統一(URLの正規化)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.ドメイン名\.com
RewriteRule ^(.*) http://ドメイン名/$1 [R=301,L]

www有りのURLに統一(URLの正規化)

ニャン易度
www有りのURLに統一(URLの正規化)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ドメイン名\.com
RewriteRule ^(.*) http://www.ドメイン名/$1 [R=301,L]

index.html無しのURLに統一

ニャン易度
index.html無しのURLに統一
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://ドメイン名/$1 [R=301,L]

index.htmlとindex.phpを統一しindex.html無しのURLに統一

ニャン易度
index.htmlとindex.phpを統一しindex.html無しのURLに統一
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ http://%{HTTP_HOST}/$1 [R=301,L]

httpからhttpsへリダイレクト

ニャン易度
httpからhttpsへリダイレクト(2種)
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://ドメイン名/$1 [R=301,L]
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

301リダイレクトが必要なケース

以下のような時は301リダイレクトを設定しましょう

  • サイトのドメインが変更された場合
  • ディレクトリやファイル名が変更された場合
  • パーマリンクが変更された場合
  • 「wwwのありなし」や「https」でそれぞれアクセスできる場合
  • 「index.html」「index.php」など拡張子ありのURLが混在している場合
  • 同じコンテンツのページなのに複数URLが生成されている場合

302・・・一時的な移動(転送)

古いサイトの情報が新しいサイトに引き継がれない
メンテナンスページへのリダイレクトなどに使用

ドメイン単位のリダイレクト

ニャン易度
ドメイン単位のリダイレクトする
RewriteEngine On
RewriteCond %{http_host} ^www.転送元URL.com
RewriteRule ^(.*)$ http://www.転送先URL.com/$1 [R=302,L]
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

特定ページのみリダイレクト

ニャン易度
特定ページのみリダイレクトする
RewriteEngine On
RewriteRule ^転送元URL\.html$ http://www.転送先URL.com/ [R=302,L]

copypet.jp

CSS3などで新たに追加された要素・装飾方法など、日々コードを書いていないと忘れてしまったり、ささっとプロトタイプを作る時などちょっとしたことに時間をかけている暇はない。そんな時に「あ〜、あれストックしときゃよかったなぁ」って困った自分用のストックブログです。カスタマイズなどがしやすいよう、昨今のweb制作に取り入れられる一般的なコードを中心に掲載しています。

More Info

こんな記事はいかがですか?