htaccess機能を使ってURLからパラメータを削除する

アクセス解析を見ていると、このサイトのページのURLに「?」の付いたパラメータ(クエリ)があるのに気がつきました。全く身に覚えのないものですが、これがある為にページが表示されないことがあります。また、検索エンジンに重複ページとして認識されるおそれがあります。

URLパラメーターとは

サーバーの写真

URLパラメーターとは、URLの後ろに「?****」などの文字列がついたものです。 CGI楽天 やPHPで書かれたページによく使われています。

コンピュータプログラムによって、URLのパラメーターを使ってネット上に動的なページを作成することがあります。ネットユーザーの要求によってプログラムが自動的にウェブページに表示する仕組みで、各種の申し込みフォームやアンケートのようなページでよく利用されています。

付加されたURLパラメーターの弊害

外部のサイトからパラメータ付きのリンクが張られていると、それをクリックして私のページに来ると、ページが表示されないことがあります。また、ページが表示されてもパラメーターまで表示されて、検索ロボットにパラメータ付きのリンクとみなされるおそれがあります。

これは重複コンテンツと言って、アドレスが違うのに同じページが表示されることとなります。こうなるとSEOでは不利になります。そこでhtaccessファイルを使ってパラメータのないURLにリダイレクトさせることにしました。

htaccessを使ってPHPファイルの場合のみパラメーターを削除する

次のようなhtaccessファイルでPHPファイルのURLのパラメーターを削除してみました。元々私の作ったページにはパラメーターが付いていませんのでこれで問題はありません。しかし、CGIで作った掲示板にはパラメーターが付いていますので、これを除外する必要があります。

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

これを実現する為に、2行目でPHPファイルだけに限定しています。3行目で、「%{QUERY_STRING}」を使ってパラメータがあるかどうかを調べています。4行目でパラメータを全て削除しています。「/$1?」とすると、「?」が付いてしまいそうですが、「?」も含めて削除してくれます。

htaccessを使ってPukiWikiのFrontPageのパラメータを削除する

PukiWikiを使っていると、ページを指定しない場合は、デフォルトでURLに次のようなパラメータが付いてきます。

http://hogehoge.jp/index.php?FrontPage

この「index.php」は、「pukiwiki.ini.php」の設定によって消すことが可能ですが、「?FrontPage」を消すのは普通ではできません。そうすると次のように様々なURLで同じページが表示できてしまいます。また、「index.php」を消す設定にしてもPukiWikiの内部ではFrontPageを表示させるには、次の1番目のアドレスしか使えません。

http://hogehoge.jp/?FrontPage
http://hogehoge.jp/index.php?FrontPage
http://hogehoge.jp/index.php
http://hogehoge.jp/

これではSEO上不利なので、.htaccessを使ってPukiWikiのFrontPageのパラメータを削除してみました。また、下記のように「index.php」にアクセスがあった時にトップページのアドレスを指定しない方法も適用します。そうするとアドレスは上記の一番下の短いURLに統一されます。

RewriteEngine on
# Remove '?FrontPage'
RewriteCond %{QUERY_STRING} ^FrontPage$
RewriteRule ^(.*)$ /$1? [R=301,L]

これを実現する為に、3行目で「%{QUERY_STRING}」を使ってクエリストリングに「FrontPage」が付いているものだけに限定しています。4行目でパラメータを全て削除しています。「/$1?」とすると、「?」が付いてしまいそうですが、「?」も含めて削除してくれます。

htaccessを使ってトップページのアドレスを指定しない方法も適用

トップページのアドレスは普通index.htmやindex.phpのようになっていて、ホームページのアドレスは http://hogehoge.jp/と書いて、indexファイルを指定しないのが普通です。この方法だとindex.htmからindex.php に変更しても、ホームページのアドレスを変更する必要はありません。

しかし、インデックスファイルを指定していなくても、検索にインデックスファイルを含んだページが登録されてしまうことがあります。SEOの点ではこれは好ましくないので、htaccessを使ってトップページのアドレスをindexファイルの無いものに統一しましょう。例えば、 http://hogehoge.jp/index.phpにアクセスがあった場合にhttp://hogehoge.jp/に301で永久転送する方法です。

なお、これは他の設定によっては無限ループの可能性がありますので注意してください。ファイルの拡張子が、index.php または index.htm または index.html の場合は、ファイル名を取り去ってから、この内どれかのファイルがあれば、そこにアクセスします。条件はきびしく指定した方が間違いがありません。

RewriteEngine on
RewriteCond %{THE_REQUEST} (^.*/index\.php|^.*/index\.htm)
RewriteRule ^(.*)index\.(php|htm) /$1 [R=301,L]

いずれの場合もこれができるのは、パラメータが付いていても付いていなくても、両方でアクセスできる場合か、パラメータが付いている場合はアクセスできなくて、パラメータ無しの場合はアクセスできる場合に限られます。