ここ数週間でやってきたことまとめ - 301リダイレクト記述方法

1週間ほど前にブログの移転を完了しました。現在、アクセス数の低下も無いため正しくリダイレクトされているようです。

移転に伴い、301リダイレクトなるものを利用してみたり、サーバー内も色々弄りました。
また何かあったときに調べ直すのも面倒なので、今回は管理人のメモ的な記事になります。

内容は主に「301リダイレクトの記述方法」になります。
興味ない方は特に面白みなど無いかと思いますが、結構苦労したので記録を残しておかないと後々面倒なのです・・・

ということで今までやってきたこと書いていきます。誰かの参考にもなれば嬉しいです。


301リダイレクト

前からちょくちょく書いていましたが、一体これは何のことなのかまでは書いてません。
なので、ここで勉強してみたことを解説風にまとめてみます。

恒久的なサイトの移転に使う、リダイレクトの一種

Webページで言うリダイレクト【redirect】とは、あるWebページへリンクが貼ってあるとき、貼ってあるページへ飛ぶのではなく別のページへ転送(リダイレクト)させる機能のことです。

リダイレクトにも色々種類があって、それぞれ転送の意味が違ってきます。

今回使ったのは「301」が与えられているリダイレクトです。
301が付くリダイレクトは、検索エンジンに対して「恒久的なWebページの移転」を知らせることができます。

ただのリンクではペナルティを受ける可能性がある

WebページをAからBへ移転させるとき、ただの「こちらへ移転しました」リンクだけでは問題があります。
検索エンジンから見ると、同じ内容のページが2つできていると判断されてしまい、ミラーサイトとしてペナルティを受ける可能性があるのです。ペナルティを受けると、サイトの順位が下がり検索されにくくなるなどの影響を受けます。

301リダイレクトで恒久的に移転したことを知らせる

そうなってはサイト管理者は涙目です。仕事、趣味どちらでやっていたとしても、基本は他人に見られてほしいものがWebサイトです。それが検索されにくくなるのは困ります。

なので、同じページがあったとしても検索エンジンに「これは移転後のページだよ」と教えてあげる必要があります。
それを明示的に示してあげるのが「301リダイレクト」なのです。(因みに「サンマルイチ」と読むそうです)

GoogleやYahoo!も推奨している移転方法です。

他にもあるのか?というとあります。「302リダイレクト」と呼ばれるリダイレクトがあるのですが、こちらは「一時的な移転」にのみ使うリダイレクト方法のため、リダイレクトを切ってしまうとすべて元に戻ります。

301リダイレクトのメリット

  1. まずひとつに、旧URLのリンクをクリックしても自動的に新URLへ転送してくれます。
    このブログ、はてなブックマークなどからもリンクを貰っていますが、それらは旧URLで貼られてしまっています。
    それらURLをクリックしても、違和感なく転送されるのでユーザー側に不便を与えません。
  2. 次に、旧URLのサイト評価を受け継ぐことができること。
    サイトというのは、長く運営されてきた分だけ評価される仕組みになっています。これをリダイレクトせずに移転してしまうと、新しいサイトは評価が0からになってしまいますので非常に勿体ないことになります。検索結果トップにでていた記事も、評価のし直しで圏外に飛ばされてしまうこともあります。301リダイレクトはこの現象を防ぎます。

因みに、302リダイレクトの場合だとこれらサイトの評価に関する情報は引き継がれません。

また、HTML内で記述できるリダイレクト方法として「META Refresh」タグを使う場合もあります。「移転しました。○秒後にジャンプします」というあれです。意味合いだけならこれでもいいのですが、これだとサイト評価まで引き継がれないので、できるだけ「.htaccess」を使う301リダイレクトをした方がよいでしょう。

記述の仕方

記述は「.htaccess(ドット・エイチ・ティー・アクセス)」に書き込みます。

ファイル名はそのまま「.htaccess」ですので「~.htaccess」のようには書きません。ややこしいですね。
ただ、Windows標準ではドット(.)以下を拡張子として認識するため、このままだとエラー「ファイル名を入力してください」が出て作成できないので、適当に「txt.htaccess」などとメモ帳などでファイルを作り、サーバーにアップロードしてから名前を変更するとうまくいきます。

「.htaccess」とは、Apacheと呼ばれるWebサーバーソフトウェアで使用できる、Webサーバーの動作を制御するためのファイルです。通常、共有サーバーを使っている場合はサーバーの設定を弄ることができません。ですが、.htaccessをディレクトリへ置くことである程度ではありますがサーバーの動作をこちらで制御することができるようになります。
※共有サーバーによっては.htaccessが置けないサーバーもあります。

私が契約しているホスティング会社「さくらインターネット」の共有サーバーでは.htaccessが利用できますので、これを使った301リダイレクトを記述しました。(本当は「Mod-Rewrite」という機能にも対応している必要有り)

ドメイン全体をリダイレクト

まず、以前のドメインであった「http://michisugara-aud.sakura.ne.jp」をすべて「http://michisugara.jp」へリダイレクトするコードを記述します。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^michisugara-aud¥.sakura¥.ne¥.jp
RewriteRule (.*) http://michisugara.jp/$1 [R=301,L]

先頭に「Options +FollowSymLinks」を付けるコードも見かけましたが、さくらサーバーではこの「Options」が使えないようなので記述しません。記述するとエラー「500 Internal Server Error」をはきます。

[R=301,L] が301リダイレクトを明示する記述です。これがないと「302リダイレクト」となってしまうようです。

「.(ドット)」の前に「\(円マーク)」が入ることに注意。
正規表現の記述やら謎の記述がありますが、あまり勉強してないので解説は省略!(ごめんなさい)
取りあえずこれで動いたので一応満足、また時間があったら勉強します・・・

記事ページをそれぞれ個別にリダイレクト

さて、これでドメイン名に関して言えばすべて新ドメインへと自動的に変更されリダイレクトされることになります。
しかし、今回の移転ではブログ記事のURLの変更もしてしまったため、これだけだと過去記事のリンクがすべて無効になります。つまり、リンクをクリックしても見つからない「404 エラー」が返されてしまいます。

404
▲404 エラー

一度すべてトップページへ転送するというやり方もできますが、各ページの評価を受け継ぐことができないので却下。
なので、過去記事すべてに対して個々に新しい記事へ転送する記述をしてやる必要があります。

ひとつのURLに対して一個ずつリダイレクトする場合、以下のように記述します。(URLは各自変更してください)

Redirect 301 /○○/○○.html http://○○/○○/○○.html

これで記事単体に対してリダイレクトできるようになります。
最初の記述がリダイレクト元です。こちらは「http://」から始めずドメイン名以下を記述すればよい模様。
そして最後にリダイレクト先を記述すればOK。こちらは絶対URLにて記述しないとうまくいきません。

ディレクトリ単位でリダイレクトしたい場合はURLを「/(スラッシュ)」で止めればいいみたいです。

記事のリストを簡単に作る方法

個々の記事に対してリダイレクトしなくてはいけないため、旧URLと新URLの対応表を作らなくてはいけません。
ひとつひとつクリックしながら作っていくのはとっても面倒なので簡単に作れないかどうか考えました。

当方、CMSとして「Movable Type(以下MT)」を利用しているので、まずMTを使い記事URLの抽出をしました。

<MTEntries lastn="0">     
  <p><a href="<$MTEntryPermalink$>">
  <$MTEntryTitle$>
  </a></p>
</MTEntries>

これはうちのブログのサイトマップページ下部で使っている記述です。全記事タイトルとURLがセットになってリンクが作られます。なので、URLのみの抽出ならば

<MTEntries lastn="0">     
  <p><$MTEntryPermalink$></p>
</MTEntries>

これだけでいいと思います。

これを新旧両方のサイトで記述して構築します。これで新旧のURLが一覧で取り出せるようになります。

次にExcelを起動し、新旧両方のURLをコピーして貼り付けます。このとき、A列を旧URL、B列を新URLとして貼り付けると対応表ができます。そして、旧URLは「http://ドメイン名」までを置換で空白にします。

後は下記のような301リダイレクトの記述法に則ってA列のURLとB列のURLを結合すれば完了です。

Redirect 301 /○○/○○.html http://○○/○○/○○.html

使うExcelの関数は「CONCATENATE関数」です。これは指定したセルの文字列を結合させる関数です。
以下の式をC1に記述してオートフィルで一気に作っていきます。

=CONCATENATE("Redirect 301 ",A1," ",B1)

結合してできた文字列を.htaccessの先頭に記述すれば完了です。
「RewriteEngine on~」の記述が先にあるとうまくいかない模様。

正規表現使えばもっと簡単にできたと思うけどあまり使ったことがなく、どう記述すればいいか分からなかったのでMTとExcelを使う手法で解決。

まとめ

自分メモ的なところがあるので、あまりまとまってなくてすいません。

取りあえず、当ブログはこれで301リダイレクトがうまくいっています。
記事も200ページなく個別にリダイレクトできるレベルで助かりました。旧リンクが無効になるのは避けたかったですし。
もう当分は移転しないと思いますが、何かあったときのために記事にしておきました。

何かの参考にもなってくれれば嬉しいです。

参考

サイトの移動を Google に通知する - Google ウェブマスターツール

301リダイレクトの設定方法 | 海外SEO情報ブログ

301リダイレクト設定とmeta refreshリダイレクト | 無料SEO対策のススメ

さくらレンタルサーバーのhtaccess設定や301リダイレクトまとめ

以上、様々なサイトを参考にさせていただきました。この場をお借りして御礼申し上げます。

追記 - コメントの不具合を修正

スパムコメントが移転してからばっさり止んでたので、コメント投稿正常に動作しているのだろうかと不安になって調べてみたら、「不正な要求です。」とエラーを返されました・・・

やっぱりコメントができなかったんですね。これを1週間放置してしまい申し訳ありませんでした。
(自分から自分のブログへコメントするなんてしないですからね・・・テストしておけばよかったです)

コメントのform 要素でcgiへのパスが旧URLになっていて、しかもリダイレクトが正常に動作しなかったのが原因でした。
現在はmt-config.cgiの記述も書き直したため正常にコメントできます。ご迷惑をおかけしました。

う~ん。でもこうなると他のCGIもどこかでエラー起こしているのではないかと心配になってきた・・・
色々調べた方がいいかも。

スポンサーリンク

Comments [2]

http://www.michisugara-aud.sakura.ne.jp はリダイレクトされませんね。
wwwありのアクセスをwwwなしのアドレスにリダイレクトする設定を先頭に記述し、
さらにmichisugara-aud.sakura.ne.jpをmichisugara.jpにリダイレクトするように
2段階の記述に変更する(変換してから転送)か、移転後のmichisugara.jpの
方で受け取ってから、wwwありのアクセスをwwwなしのアドレスにリダイレクト
する(転送してから変換)設定を記述するなどしたほうがもっと良いように思いました。

それと、例えば現状ではhttp://michisugara.jp///archives///2013////cut.html
のように「/」が無駄に多段重ねされたアクセス要求もそのまま通していますが、
これも「/」が1つだけにまとまるようにすると良いように思いました。

正規表現の置換で「/」そのものを扱うのにはちょっとコツが必要かもしれません。

おお、態々アドバイス有難うございます!

1つめのwwwありでリダイヤルが効いてないのは正直言いますと面倒くさかったからです(汗
さくらインターネットで「WWWあり」ドメインを無効にすることができるので、移転前はこれを使って無効化していました。
ただ、こうするとこの記事で書いている.htaccessでのリダイヤル設定が効かなくなるので、今は有効状態になっていますね。こういった経緯で「WWWあり」のリンクなんて無いだろうと思い完全に失念していました。
一応、「canonical」にて正規化を行っていますのでそこまで大きな問題にはなっていないはずですが、手直ししてみますね。

 追記:手直ししてきました。wwwありのアクセスをwwwなしへ変換後、「michisugara.jp」へリダイレクトします。

次の「/」についてですが、これは今始めて知りました。確かにこういった要求は通るのですね。
これによって何か不都合がでてくる場合は検討してみたいと思います。まずはちょっと調べてきますね。

ご教授ありがとうございました。

このページの上部へ

サイト内検索

広告

Powered by Movable Type 6.3.2