F.Ko-Jiの「一秒後は未来」

.htaccessでパラメータつきのURLをパラメータなしのURLにリダイレクトする方法

最近よくGoogleアラートで見覚えのないページが通知されてきていました。具体的には、このブログのトップページのURLに更新日時がパラメータ(クエリ)としてくっついたものです。

(例) http://blog.fkoji.com/?08271006

こんなURLをこのブログからリンクさせた記憶はなく、アクセスログを調べてみると、とあるサイトからこのパラメータつきのリンクが貼られていることが分かりました。

ただのbotからのアクセスなら構わないのですが、サイトからリンクされているゆえにGooleがインデックスしてしまい、重複コンテンツとなってしまいちょっと困ります。

そこで.htaccessを使ってパラメータなしのURLにリダイレクトさせることにしました。

参考にしたページはこちら。

» .htaccess hack: remove query strings from URLs

具体的には次のようにしました。この例では、パラメータが8桁の数字だった場合に限って、パラメータなしにリダイレクトさせています。

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} ^\d\d\d\d\d\d\d\d$
RewriteRule ^(.*)$ /$1? [R=301,L]

4行目で「$1」の直後に「?」をつけるのがミソで、こうすると「?」だけ残るかと思いきや「?」も取り除かれたURLにリダイレクトされます。

もしもパラメータの形式によらずにパラメータなしのURLにリダイレクトさせたいなら3、4行目は次のように書きます。

RewriteCond %{QUERY_STRING} !=""
RewriteRule ^(.*)$ /$1? [R=301,L]

ただしこの書き方では、ページングで「?page=」などのパラメータを利用していた場合などにアクセスできなくなってしまい、あまり推奨できません。

そういう場合には実際に利用しているパラメータだけ対象外とすることもでき、たとえば次のように書きます。

RewriteCond %{QUERY_STRING} !=""
RewriteCond %{QUERY_STRING} !^page=.*
RewriteRule ^(.*)$ /$1? [R=301,L]

しかし、サイト内で利用されている全てのパラメータを把握するのはなかなか難しいので、なるべくリダイレクトの対象にしたいパラメータに特化して、RewriteCondを記述するほうが望ましいでしょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など