.htaccessを使ってHTTPヘッダーにrel="canonical"を指定する方法
Official Google Webmaster Central Blog によると、Googleウェブ検索のクローラーが、HTTPヘッダーで指定される「rel=”canonical”」のサポートを開始したとのことです。
» Official Google Webmaster Central Blog: Supporting rel="canonical" HTTP Headers
これはなんですか?
通常「rel=”canonical”」はHTMLのheadタグ内にlink要素として記述します。
<link rel="canonical" href="http://blog.fkoji.com/2011/06151739.html" />
URLの正規化対象がHTMLページであればこれで良いのですが、例えばPDFドキュメントのようにHTML以外のURLを正規化したい場合には当然使えません。
そこで Google はHTML以外のコンテンツに対してもURLの正規化ができるように、HTTPヘッダー内での「rel=”canonical”」に対応したというわけです。
.htaccessを使ってLinkヘッダーを追加する
PHPなどのプログラム経由であればHTTPヘッダーを追加することは簡単ですが、対象のファイルがプログラム経由で出力されるとは限らないので、ここでは .htaccess を使った方法を説明します。
まず、Googleの説明によると、HTTPヘッダー内での「rel=”canonical”」は、次のように出力します。(ドメインは説明のため example.com としています。)
Link: <http://example.com/sample.html>; rel="canonical"
このヘッダーを .htaccess で出力するには「Header set」を使います。
Header set Link "<http://example.com/sample.html>; rel=\"canonical\""
このままだとすべてのファイルのヘッダーにセットされてしまうので、例えば「sample.pdf」のみに適用されるようにするには、次のようにFilesディレクティブを利用します。
<Files "sample.pdf"> Header set Link "<http://example.com/sample.html>; rel=\"canonical\"" </Files>
こんな感じです。これで sample.pdf がリクエストされた時には Link ヘッダーが出力されるようになります。
あとは rel=”canonical” を設定したいファイルごとに同様の記述を・・・としてもいいですが、ファイルが複数ある場合はかなり面倒です。
そこで、たとえばPDFファイルのHTMLバージョンが同一のファイル名(もしくは規則的なファイル名)で提供されている場合には、環境変数を利用して以下のように記述できます。
<FilesMatch "\.pdf$"> SetEnvIf Request_URI "(.*)\.pdf$" Req_Uri=$1 Header set Link "<http://example.com%{Req_Uri}e.html>; rel=\"canonical\"" </FilesMatch>
Header set の行にある %{Req_Uri}e は、その1行上の SetEnvIf の行で設定している環境変数で、 Request_URI の値の「.pdf」より前の値が格納されています。
たとえば http://example.com/sample.pdf というファイルがリクエストされるとRequest_URI には「/sample.pdf」という値が格納されているため、上記の例では Req_Uri には「/sample」がセットされます。
1行目のFilesMatchで「.pdf」で終わるファイルに限って適用するように指定しているため、最終的にこの Link ヘッダーはPDFファイルがリクエストされた場合にのみ適切に出力されます。
(例) ファイル名が「test.pdf」の場合には、
Link: <http://example.com/test.html>; rel="canonical"
というヘッダーが出力されます。
※ なお、Apacheのバージョンが低い場合にはエラーになるかもしれません。
このように、.htaccessを使って Link ヘッダーを出力すれば、どんなコンテンツであっても canonical URL をクローラーに教えることができます。
もし何か間違いがありましたらコメントで教えてください。
参考ページ
» mod_headers – Apache HTTP サーバ
» LinkHeader – W3C Wiki
コメントを残す