
概要:
今回は、今話題(もう、昔?)のCanonical Urlを設定してくれるモジュールの紹介です。
Canonical Urlとは、直訳すれば、"正規のURL"とでもいうべきでしょうか。意訳すれば、"唯一の正しいURL"という感じでしょうか。
つまり、以下のようにHTMLの中に記述することで、"このページの本当のURLは、これですよ"と指定しれあげるものです。
<link rel="canonical" href="http://www.off-soft.net/ja/software/dvd/eac.html" />
例えば、上記の場合であれば、Joomla!の場合などでは、特に、いろいろURLでアクセスできます。
http://www.off-soft.net/ja/software/dvd/eac.html http://www.off-soft.net/index.php?option=com_content&view=article&id=170
上記の例は、いずれも同じ記事を表示できますが、見た目上、URLが異なります。それを、検索エンジンに「同じ記事ですよ」と教えるのが、Canonical Urlの設定です。
(ただし、このモジュールでは、上記のURLを同じURLでCanonical Urlを設定することはできません。以降にその回避策のヒントも記載しています。)
この設定を行うことで、Joomla!のようなCMSで色々なURLの指定ができる場合、1つの記事を同じページであることを認識することで、
検索エンジン側は無駄を削除し、検索される側は、ページランクを上げる効果があるとされています。
今回、記述します"Canonical URL" Module for Joomla 1.5 は、モジュールながら、簡単にすべてのページにCanonical URLを設定してくれます。早速、簡単に説明してみます。
先のダウンロードサイトから、gzファイルをダウンロードし、インストールを行います。
(メニューの [エクステンション] - [インストール/アンインストール] から行ってください。)
インストールの後、[モジュール管理] で、[ Canonical URL Module ]が無効状態で、既にありますので、クリックして設定画面を表示しましょう。

[ Canonical URL Module ]の設定画面から、各情報の設定を行います。

| パラメータ名 | 説明 |
| Rule01: Find part of URL | 検索するURL |
| Rule01: Set part of URL | 置換するURL |
※Rule01 - 10 まであります。
このモジュールは、このパラメータからもわかるように、URLの文字列の一部を変更することで異なるURLを同じと判断します。
例えば、以下のように設定した場合、1つの記事が複数ページにわたっていても1つのURLで設定されます。
Rule01: Find part of URL start=
Rule01: Set part of URL
複数ページにおよぶ記事の場合、URLのパラメータに"start="が付いてきます。その情報を削除することで、複数ページの記事が1つのURLで指定されます。
また、JoomFishを使っている場合、日本語、英語の記事を同一URLにまとめることもできます。
ただ、概要でも記述したとおりJoomla!では、いろいろなURLでのアクセスが可能です。
特にSEOを有効にしている場合に、そのURLは、多くなります。そのような場合、どのようにすれば良いでしょう。
次に、その回避策の一つを簡単に解説したいと思います。
最も単純なやり方は、すべての内部リンクを統一することです。
どういう形式のURLで統一するかは、管理人次第でしょう。
ここでは、メニューのURLに統一するやり方を記述してみます。
/modules/mod_canonical/helper.php は、Canonical URL ModuleのURLの設定処理を行っているクラスmodCanonicalHelperが、記述されています。
その一部に、メニューで設定しているURLへ変換する処理を追加してあげることで、統一を図ってみましょう。
[helper.php]
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | $_dom = ($_before!="")?(substr(JURI :: base(), 0, -1)):(JURI :: base()); // add search menu if(isset($_GET['id']) && substr($_before,0,10)=='/index.php' && strstr($_before,'view=article')!==false){ $id_article = $_GET['id']; $menu = &JSite::getMenu(); $items = $menu-->getMenu(); $itemId = -1; foreach($items as $item) { if ( ! is_object($item) ) continue; if (isset($item-->query['view']) && isset($item-->query['id']) && $item-->query['view'] == 'article' && $item-->query['id'] == $id_article) { $b_1 = "index.php?Itemid=".$item-->id; $link_item=JRoute::_($b_1); if($link_item!=$b_1){ $_before=$link_item; } break; } } } //1.1 $mytrigger=0; |
72 - 91 行目が、追加された行です。
ここでは、表示しようとしているURLに、'/index.php' 及び 'view=article' , 'id=xxx' が指定されている場合、メニューから検索しています。
メニューに同じ記事IDが存在すれば、メニューIDを取り出して、メニューのURLへ変換しています。
もし、メニューに存在しなければ、そのままです。
一応、記事の表示時のみに限っていますので、その点は、多少は限定されますが、一つの案としてご提示いたしておきます。
この回避策を行わないにしても、複数ページ、固定ページをまとめることは、簡単に行えますので、試すのも一考だと思います。

今回の記事では、PHPについて、少し知識が必要です。詳しく知りたい方は、以下の本なども良いと思います。
本から学ぶことは多いと思います。ネットだけでは判らない様々な事に気づかされます。
![]() PHPによるWebアプリケーションスーパーサンプル 第2版 |
![]() PHPでつくるWEBアプリケーション制作講座 (web creators books) |
![]() PHPによるWebアプリケーションスーパーサンプル活用編 第2版 |
![]() ゼロからできる PHP+MySQL Webシステム構築 |
![]() ゼロからわかる PHP超入門 |








