自分のための備忘録も兼ねて,当サイトのFswikiのノウハウについて書いておきます。一般的にどう対応しているのか調べても出てこないもので,自分はどう対応しているのかについて書いておきたいと思います。といっても大したものはありませんが。
今日はFswikiでcanonical URLを指定する方法について。
まず,FswikiはデフォルトではURLは「wiki.cgi?page=ページ名」という動的なURLとなります。しかし,こういった動的URLは「nantarakantara.html」のような静的URLと比較すると検索ロボットがクロールしにくい=検索サイトにインデックスされにくいという説があります。と言ってもこれは昔の話で,最近のロボットは優秀なので別に動的なURLでも問題なく探し当ててくれるという説もあれば,変に動的URLを静的URLに無理矢理見せかけない方が良いという説もあります。個人的な経験談としては,別にどっちでも普通にインデックスされると思います。
当サイトでは「wiki.cgi?page=%A5%AD%A5%E3%A5%E9%A5%AF%A5%BF%A1%BC」みたいな長ったらしい意味不明なURLになるのを嫌って,パワプロ関係以外のページに関しては静的URLに見せかけています(パワプロ関係のページに関してはページ数が多すぎて面倒すぎだったのでそのまま動的URLのままですが…まあ1500ページ近くあるし)。具体的な例でいえば,「wiki.cgi?page=F-ZERO_interview」へのアクセスを,ブラウザ上では「F-ZERO_GX_interview.html」にアクセスするように見せかけるといったような事をしています。.htaccessにmod_rewriteの記述をする事でそれを実現していますが,その方法については本題でないので詳しく説明しません。Fswikiでの実装方法については「ページへのリンクを静的URLにするプラグイン(改変版)」を,mod_writeについてはここやここやここに詳しく書かれているので参照していただければよいかなと思います。
で,この「ページへのリンクを静的URLにするプラグイン(改変版)」を使うと動的ページへのリンクが静的ページへのリンクに置き換えられるのはよいのですが,-(ハイフン)や_(アンダーバー)などの記号がエスケープされて「%2D」とか「%5F」になったりします。別に「F-ZERO.html」が「F%2DZERO.html」になったところでアクセスはできるので問題ないのですが,ちょっと気持ち悪いし,Googleに「F%2DZERO.html」としてインデックスされるのはちょっと私的には気に入りませんでした。「F-ZERO.html」と「F%2DZERO.html」という2ページにリンクが分散し,SEO的にもよくありません。
この場合,canonical URLを定義するタグを追加してやって,URLの正規化をするのが一番よいと思います。すなわち,「F-ZERO.html」と「F%2DZERO.html」は同じページですよ,「F%2DZERO.html」は「F-ZERO.html」のコピーページですよ,と宣言し,「F%2DZERO.html」のページへの被リンクなどの情報を「F-ZERO.html」に流してやる事が(SEO的には)必要です(参考:link rel=”canonical”によるURL正規化タグ——SEOにとって非常に重要な進歩(前編))。ちなみに個人的な経験上,このlink rel=”canonical”タグは威力絶大で,書いておくとすぐに検索サイト上には反映され,301のステータスを返したりするよりもよっぽど効果的です(まあ検索サイトのアルゴリズムなんてすぐ変わるものだから,2011/9現在の時点での話ですが)。
そのためには,普通のHTMLのページなら<HEAD>~</HEAD>間に1行,「<LINK rel=”canonical” href=”http://なんちゃらかんちゃら/F-ZERO.html”>」と書いてやればいいのですが,Fswikiではそういった<HEAD>~</HEAD>間のソースをいじるなんて事はできません。テンプレートをいじればできなくはないですが,ページ数分テンプレートを用意するのはかなりキチガイじみています。また,Fswikiのプラグインとして「canonical URLを指定するプラグイン」くらいあってもよさそうなものですが,2011/9/25時点でまだありません。
そこで,当サイトではレイアウト・プラグインを利用する事でcanonical URLの指定を実現しています。手順としては,
- レイアウト・プラグインをインストールする。
- canonical.tmplというレイアウト・テンプレートを作成し,./tmpl/layout/ディレクトリにアップロードする。
- wikiソース内で{{ilayout canonical,url:なんちゃらかんちゃら.html}}と書いておけば,<HEAD>~</HEAD>間にちゃんと<LINK rel=”canonical” href=”http://なんちゃらかんちゃら.html”>というURL正規化のタグが挿入される。普通のHTMLのようにwikiソースに1行書いて終わりなので簡単でラク。
といった感じです。肝心のcanonical.tmplのソースは以下。
<!--TMPL_IF--><!-- -- LAYOUTINFO_START -- ========================================================================= -- TITLE : canonical URL指定タグの挿入 -- PARAMETER : url , /^(.+)$/ -- ------------------------------------------------------------------------- -- HELP_START:WIKI <= ヘルプ画面に表示する簡単な説明(WIKIフォーマット) !!利用方法 canonical URLを指定するタグを挿入する場合に利用します。 URLの入力チェックはしませんので間違いなく入力してください。 http://以外は指定できない(https://とか)けど,まあいいよね。 {{ilayout canonical,url:絶対URL(http://抜き)}} {{ilayout canonical,url:ghiaccio.sakura.ne.jp/}} -- HELP_END -- ========================================================================= -- LAYOUTINFO_END --><!--/TMPL_IF--> <!--TMPL_IF NAME="IS_FIRST_TMPL"--> <!--FSWIKI_HEAD_INFO--> <link rel="canonical" href="http://<!--TMPL_VAR NAME="url"-->"> <!--/FSWIKI_HEAD_INFO--> <!--/TMPL_IF-->
まあ,自分以外が使う事を想定して書いてないので,URLの入力チェックもやっていなければhttp以外(httpsとか)のURLが指定できるようにも作っていないのが今パッと見で気付いたところではよくないと思いますが,そのへんはテキトーに改変してくれればよいと思います。
もう1つデメリットとして,ページ内のwikiソースにいちいち書かないといけないのもめんどくさいなと思います。ページ数が少ないwikiであれば全く問題ありませんが,パワプロ用語Wikiのようにページ数が1000以上とかなるともうめんどくさすぎて設定する気力が起こりません。
誰かが管理ページから一括でcanonical URLを設定できるようなプラグインを作ってくれればよいのですが…。まあいつか誰かがそれを作ってくれるまでの一時しのぎとして参考にしてくれれば幸いです。
ちなみになんでこの記事を書いたかというと,メトロイドプライム ログブック集のチョウゾロア(metroidprime1_logbook02.html)のページだけなぜかインデックスされないので,なんでかな~とよくよく見てみると,このページのURL正規化のタグが<LINK rel=”canonical” href=”http://ghiaccio.sakura.ne.jp/metroidprime1_logbook01.html”>と誤記となっていたからなのでした…。つまり,チョウゾロア(metroidprime1_logbook02.html)のページがパイレーツデータ(metroidprime1_logbook01.html)のコピーページですよ,と宣言していたのです…。全く内容の違うページなのに…。パイレーツデータのページをコピーしてベースとしてチョウゾロアのページを作っているのですが,その際にページ名を直すのを忘れていたのです…。もうすでに検索エンジンにはそのように誤解されて認識されているようで,すぐにソースは修正しましたが,いつGoogle等に反映されるのか?明日?2ヵ月後?3ヵ月後?分かりません…。この日記を書く事で,ロボットにクロールされて修正されればよいのですが…。このように,打ち間違えると非常に危険なので,打った後は間違いがないか,丁寧にチェックしましょう…。特に私のように作業の手番を減らすために,ベースのページからのコピーコピーでページ作成するような時には…。