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

.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

コメントを残す

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

著者について

fkoji

F.Ko-Ji

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

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