mod_rewriteで動的サイトを静的サイトにみせてSEO対策

PHPなどでデータベースやWebサービスを使うサイトを作るとURLの末尾にクエリ文字列というものがくっついたやたらと長いURLになってしまいます。
どうもこの部分が長いとGoogleやYahoo!などは積極的にページをインデックスしてくれないようです。
せっかく作ったページも検索結果ページに反映されないのでは悪い意味で涙もの・・・。
この問題を解決するには、mod_rewriteというApacheモジュールをつかって動的ページを静的ページに見せるという方法があるようです。
Apacheやmod_rewriteのことはほとんど知らない状況ではじめたので、実際にテストしてみた結果を掲載しておきます。

目標とすること

 http://sample.com/index.php?mode=aaa&id=bbb 

にアクセスした場合と

 http://sample.com/aaa/bbb/ 

にアクセスしたときの結果を同じにすることが目標です。
この技術をつかうにはmod_rewriteが使えるサーバーが必要になってきます。レンタルサーバーでは.htaccessで設定を行なうのでこれも使えることが条件となります。レンタルサーバーとして借りているロリポップ! チカッパ! は共にmod_rewriteと.htaccessが使えるのでOKです。

.htaccessの作成

.htaccessファイルを動的だけど静的なページの作成 (mod_rewrite)を参考に作成します。コードは次のとおり。

これを設置するだけで出来上がりです。index.phpには「mode」と「id」の値が引き渡されることになります。

コードの説明

RewriteEngine on は、必ずはじめに書いておきます。

RewriteCond は条件を付加するための記述です。if構文みたいなもののよう。条件に一致した場合のみURLの書き換え(RewriteRule)を実行します。
ここでの意味は「リクエストしたファイルやディレクトリがもともと存在していればなにもしない」という意味になるようです。この部分はなくても動くようですが念のために記述しておくことにします。

最後のRewriteRuleが実際にどのように変換するかを決める記述となります。前半の正規表現の部分にマッチするディレクトリにアクセスすると後半部分の形式に変換されます。
「^([0-9A-Za-z]+)/([0-9A-Za-z)]+)/$」
は、この例でいうと「http://sample.com/ 」以下の部分「aaa/bbb/」にマッチするような正規表現になっていて、「( )丸括弧」の部分にマッチした文字列が順番に「$1」「$2」に入ります。これを後方参照というそうです。
もしクエリ文字列を増やしたいときは

^([0-9A-Za-z]+)/([0-9A-Za-z)]+)/([0-9A-Za-z)]+)/$ index.php?mode=$1&id=$2&p=$3

と記述すればいくらでも増やすことができます。

mod_rewrite の書き方についてはなにも判らないところからはじめているので説明で間違っている部分があるかもしれませんが、そのときはコメントで教えてもらえると助かります。

そうのひとりごと

© 2017 PAOLOG