URLのリライトツールを自作してみよう(前編)
パラメータ入りのURLを人にもクローラにもわかりやすいURLに変換することの利点は、みんなすでに理解していることだろう。でも、カテゴリや製品ページの数が膨大にある場合、標準的なURLリライトツール(ISAPI_Rewrite、mod_rewriteなど)では、必ずしもそれほどうまく対応できるというわけではない。そこで今回は、このコードを自分で書くには何が必要かを順を追って説明して、みんなが思っているほど恐ろしくも複雑ではないことをわかってもらい、その後のメンテナンスや柔軟性などについての利点もいくつか示すつもりだ。
概要
- 出発点君のサイトではパラメータが含まれたURLを使用しているが、SEOおよびユーザーの使い勝手という観点からは、ある程度読みやすいURLのほうが有利ではないかと考えている。
- サイトにはたくさんのコンテンツがある。その多くはデータベースから引き出してきたものだ。
- 製品、カテゴリ、サブカテゴリなどの数は、ISAPI_Rewriteやmod_rewrite用のルールを作成する(そして管理する)ことを考えただけでも泣き叫んで逃げ出したくなるほどだ。
自分でURLのリライトを行う場合、次の4点に気をつけなければならない。
すでに獲得している被リンク――旧URLを新URLに301リダイレクトする。
サイト内被リンク――サイト内でリンクを張っている箇所すべてについて、パラメータ入りのURLを、読みやすいURLに変換する。
コンテンツの表示――新URLに対してリクエストがあったら、それを、ユーザー(および検索クローラ)からは見えないパラメータ入りのURLを持つページで処理する。
複製コンテンツの問題。
リダイレクト全般について理解があやふやなら、「URLリライトと301リダイレクトの仕組み(日本語記事)」という記事が参考になる。
話を明確にするために、今回は新婚向けのギフト帳と新婚旅行の手配のサービスを手がける僕のサイト「TheBigDay」を実例として使おうと思う。
このサイトでは、リゾートホテルを「ハワイ > マウイ島 > ザ・フェアモント・ケア・ラニ・マウイ」という具合に「大分類 > 小分類 > ホテル名」という形で分類している。今回は昔ながらのASP(アクティブサーバーページ)による例を示すけれど、このアルゴリズムをPHPやASP.NETなどに移植する方法も簡単にわかるはずだ。
TheBigDayでは、「/Package.asp」というASPページを使ってホテルのページを生成している。これには3つの数値パラメータが必要だ。1つは所在地の大分類(この場合は「Hawaii」)、もう1つは所在地の小分類(「Maui」島)、そして最後の1つはリゾートホテルそのもの(「The Fairmont Kea Lani Maui」)をそれぞれ指し示している。こういった数値パラメータを変換して、次のようなURLにしたいわけだ。
ここで、重要なキーフレーズ「travel specials」をURLの中に組み込んだことに注目してほしい。これがSEOには有効なんだ。「ISAPI_Rewriteを使えば?」という意見もあるだろう。でもそれは、カテゴリや製品の名称がごく限られていて、しかもそれらがまったく(またはほとんど)変わらない場合の話だ。この例では、リライトの「ルール」は基本的に、識別番号と名称を逐一データベースで照合して置き換えるという作業になる。
では、この手品の種明かしをするとしよう。
パラメータで記述されたURLが獲得している被リンク
というURLを
に301リダイレクトしたいとする。
そのためには、パラメータからわかりやすいURLを生成する関数が必要だ。
Function MakeFancySchmancyUrl (nDestID, nSubdestID, nResortID)
Dim sFancyURL
sFancyURL =
"/TravelSpecials/" & _
GetDestName (nDestID) & "-" & _
GetSubdestName (nSubdestID) & "/" & _
GetResortName (nResortID) & ".htm"
MakeFancySchmancyUrl = sFancyURL
End Function
次のようなホテル名は、形を整えてやらないと、問題のあるURLが出来上がってしまう。
ここでどうしても必要なのは、単純にアルファベット以外の文字を名前から取り除いた文字列を(おそらくは元の名前よりも短くして)返す関数で、それぞれのGetxxxx()関数は、戻り値として返すべき名前を引数として、この関数を呼び出さなければならない。URL内に、名前と併せてIDを埋め込むテクニックを使っている人もいる。確かに、この方法なら、参照手続きを簡略化できるだろう。しかし、そうするとユーザーにとってURLの可読性が低下し、検索エンジンにとっても、チェックしなければならないURL内の「語」数が倍増するのではないかと思う。僕に言わせれば、そんなのは、配管補修用のテープでWebサイトを修繕しようとするようなものだ。
サイト内被リンク
サイトは隅から隅まで徹底的に調べて、パラメータ入りのURL(たとえば、/Package.asp
など)を参照している箇所をすべて見つけ出し、それを「MakeFancySchmancyUrl()」関数の呼び出しに置き換える必要がある(もし何らかの理由で見逃したサイト内被リンクがあっても、リンク先を301リダイレクトすれば、問題を回避できるが)。
さて、URLにパラメータを含むASPページは、2通りの方法で呼び出されることになる。
ユーザーまたは検索エンジンからのリクエスト(この場合、読みやすいURLに301リダイレクトしてやる必要がある)。
404ハンドラによるリクエスト(次のトピックで扱うから、ご心配なく!)。こちらの場合は、リダイレクトしちゃまずいだろう。ここで必要なのは、当該ページのロジックだけ引き継いで、実際にHTMLコンテンツを生成することだ。
この記事は前後編の2回に分けてお届けする。次回は、URLリライトツールの自作に当たって、コンテンツの表示と複製コンテンツの問題をどう取り扱えばいいかお伝えする。後編を読む
ソーシャルもやってます!