301 リダイレクトと .htaccess ファイルの記述方法

UB3/informatics/html/redirect_301

このページの最終更新日: 2019/08/06

  1. 概要: 301 リダイレクトとは
    • その他のリダイレクト方法
  2. 301 リダイレクトによる URL の正規化
    • www なしに統一する正規化
    • http と https の正規化
    • 拡張子なしに統一する正規化
    • index.html をなくす
    • 特定のフォルダをリダイレクトから除外する
  3. 古いサイトから現サイトへの 301 リダイレクト

広告

概要: 301 リダイレクトとは

301 リダイレクトとは、ウェブサイトを移転する際などに、恒久的に あるページから他のページに閲覧者を飛ばす (リダイレクトする) 方法の一つである。

主な用途は、このページで説明する「URL の正規化」と「サイト移転」である。リダイレクトすることによって、次のようなメリットが生じる。

  1. 古いページにたどり着いたユーザーが、新しいページをみつけられる。
  2. 検索エンジンの評価である SEO を引き継ぐことができる。

その他のリダイレクト方法

他にもいくつかリダイレクトの方法があるが、Google はこの 301 リダイレクトを推奨している。その他のリダイレクト方法とは、

  • 302 リダイレクト: 301 と似ているが、一時的な転送。
  • Javascript でもリダイレクトが可能であるが、非推奨である。
  • meta タグでリダイレクトが可能だが、これも非推奨。

また、古いサイトの URL を全部新サイトのトップページに転送するのも非推奨である (1)。


301 リダイレクトによる URL の正規化

このサイトでは、以下の 3 点において 301 リダイレクトで URL の正規化を行なっている。

  1. www をなしに統一
  2. http と https を https に統一
  3. ファイルの拡張子をなしに統一

それぞれについて、.htaccess ファイルの書き方を述べる。

www なしに統一する正規化

ultrabem-hobby.com というドメインのサイトを例に説明。以下の文章を .htaccess に加えることによって、URL を https に統一している。

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.ultrabem-hobby\.com$
RewriteRule ^(.*) http://ultrabem-hobby.com/$1 [R=301,L]


それぞれの意味を解説する。

Options +FollowSymLinks

RewriteEngine on

301 リダイレクトでは、「要求されたリクエスト URL を Apache の "mod_rewrite" 拡張モジュール (URL書き換えエンジン) を使用し、 正規表現を使って書き換え」るという作業を行なっている (3)。

つまり実際の作業は「書き換え Rewrite」であり、そのモジュールを起動せよという命令文がこれである。

一度 on にすれば OK なので、その他の正規化を続けて行うときには、この命令を繰り返す必要はない。

RewriteBase /

URL 書き換えの基点となるパスを設定する。省略可能。.htaccess があるパスが基点であり、それが / になる。

RewriteCond

書き換えの対象となる文字列を記載する行 (3)。

  • %{} はサーバ変数を取得する正規表現である (3)。つまり、%{HTTP_HOST} で HTTP_HOST という変数を取得している。
  • サーバ変数は、たとえば ここ に例がある。HTTP_HOST でホストを参照し、次の ^ と合わせて www.ultrabem-hobby.com であるドメインを対象にするということ。
  • 次の ^ と行末の $ は、それぞれ行頭、行末を表す記号である。つまり ^ と $ で囲まれた部分が 1 行となる。
  • この行の中で www.ultrabem-hobby.com という文字列を指定したいのだが、やっかいなことにドット . は「任意の一文字」を示す特殊文字である。ドットには「単なるドット」としての意味を持たせたいので、\. とする。\ は「特殊文字のエスケープ」であり、その次に来る文字から特殊文字としての機能を取り去ることができる。

以上によって、ultrabem-hobby.com および www.ultrabem-hobby.com の両方を書き換えの対象として指定している。

RewriteRule

上記のパターンに合致した文字列を書き直すときのルールがこの行に記載される (3)。

  • ^ は同様に行頭を示す。
  • (.*) はパワフルな表現。. は任意の一文字で、* は「直前の文字の 0 回以上の繰り返し」の意味 (3)。よって (.*) は全ての任意の文字列を意味する。
  • 最後の $1 は後方参照で、1 個目のかっこの中身がこの部分に入る。1 個目のかっこの中身は .* で、「全ての任意の文字列」である。よって、http://ultrabem-hobby.com/ 以下にある全てのページということになる。
  • 上の項目、まだちょっと咀嚼できていない。なぜ $1 が必要なのか?
  • [R=301,L] で、301 はリダイレクトの種類。L は Last で、この命令で得られた URL が、後続の命令でそれ以上書き換えられるのを禁止する。

http と https の正規化

なぜこれで動くかわからないのだが、http でアクセスすると https に飛ばされるので、機能している。勉強して更新。

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]



拡張子なしに統一する正規化

このページ に従い、以下を加えると拡張子なしでもアクセスが可能になる。php と html と両方。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html


ただし、これだけだと拡張子ありとなしが共存しており、リダイレクトされていない。あくまで、拡張子なしのアクセスを可能にする記述である。

そこで、拡張子ありのページからなしのページにリダイレクトする以下の記述も追加する。

RewriteCond %{THE_REQUEST} \.(php|html)\ HTTP
RewriteRule ^(.*)\.(php|html)$ http://ultrabem-branch3.com/$1 [R=301,L]


URL を省略するメリットとして、以下の 2 点がある (5)。

  1. 動的なページを作るために、php のファイルに変更した際にも URL を同一に保つことができる。
  2. 短くて見やすい。

.html なしの方がわずかにメリットがあるが、SEO 的な問題はないようだ。このサイトは拡張子ありで始めてしまったが、2019 年 7 月の URL 正規化で拡張子なしに統一した。


index.html をなくす

一般的にはこれでよい。

RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://ultrabem-hobby.com/$1 [R=301,L]


ただし、上記の記述では index.html をリダイレクトするようにしている。しかし、すでに別の記述によって index.html の拡張子が取り去られているので、それに対応しなければならない。よって、「または」を示す | 記号と使って以下のようにする。

RewriteCond %{THE_REQUEST} ^.*/(index.html|index)
RewriteRule ^(.*)(index.html|index)$ http://ultrabem-hobby.com/$1 [R=301,L]


この件はネット上にあまり情報がなかったので、teratail の質問 で助けて頂きました。ありがとうございました。


特定のフォルダをリダイレクトから除外する

いろいろとネット上で情報はみつかるが、このページ にあるように、トップフォルダの .htaccess でサイト全体をリダイレクトしつつ、除外したいフォルダにも .htaccess を設置して RewriteEngine off とするのが簡単。


広告

古いサイトから現サイトへの 301 リダイレクト

基本的な方法: URL を記載

かつて FC2 というサーバーに Ultrabem 2 というサイトを作っていたが、これは完全に閉鎖し、UBC および UB3 に該当ページがある場合には 301 リダイレクトするように設定した。

いろいろな .htaccess の記述方法があるが、現在のところ次のように 1 個ずつ URL を記述し、うまく動いている。RewriteEngine on などの記述はいらないようだ。


Redirect 301 /aa_carbo_lipids/aa/carnitine.html https://ultrabem.com/aa_carbo_lipids/aa/carnitine.html

Redirect 301 /aa_carbo_lipids/aa/cys.html https://ultrabem.com/aa_carbo_lipids/aa/cys.html


フォルダの名前が基本的に同じなので、まとめて記述するとちょっと転送が早くなるはずだが、どうも上手く動作しないので、仕方なくファイルを 1 個ずつ書いている。

サーバーに余計な負担をかけていることになって心苦しいが、2000 行書いて 12 ms 遅くなるという実験結果があり (1)、自分の場合はせいぜい数百行なので、許される範囲だと考えたい。


広告

コメント欄

各ページのコメント欄を復活させました。スパム対策のため、以下の禁止ワードが含まれるコメントは表示されないように設定しています。レイアウトなどは引き続き改善していきます。「管理人への質問」「フォーラム」へのバナーも引き続きご利用下さい。

禁止ワード: http, the, м (ロシア語のフォントです)


このページにコメント

Name:


Comment:



これまでに投稿されたコメント

Date Name Comment

References

  1. サイトリニューアル時の301リダイレクト、.htaccess記述方法いろいろ. Link.
  2. .htaccessに2000行書くとApacheの処理が何秒遅くなるか測ってみた. Link.
  3. .htaccess - URLの書き換え. Link: Last access 2019/07/14.