Canonical URLを設定する

少なくとも主要モジュールのdocs(pico)モジュールはこんな感じの短縮URLを採用しようと思います。

http://www.ki-dousen.net/modules/docs/index.php?content_id=2817http://www.ki-dousen.net/docs/content/2817

http://www.ki-dousen.net/modules/docs/index.php?cat_id=91http://www.ki-dousen.net/docs/cat/91

1つのページが複数のURLを持つ場合、次のようなタグを<head>タグに含めることで、正とするURLを検索エンジンに知らせます。

<link rel="canonical" href="http://www.ki-dousen.net/docs/content/1" />

これを実装する仕組みを考えました。{$canonical_url}のようなSmarty変数をテーマファイルに追加してもよいのですが、動的にタグを差し込めるようになっている{$xoops_module_header}を使うことにします。

調べてみると、/preloadにd3forumモジュール付属の(?いつ追加されたのかわかりませんが)D3forumCommonCss.class.phpというプリロードが、まさに{$xoops_module_header}へのタグ追加をやっていますので、そのソースを参考にしました。

<?php
if (!defined('XOOPS_ROOT_PATH')) exit();

class 
ArchitSitePreload extends XCube_ActionFilter
{
    function 
preBlockFilter()
    {
        
$this->mRoot->mDelegateManager->add('XoopsTpl.New', array(&$this'setCanonicalUrl'));
    }
    function 
setCanonicalUrl(&$xoopsTpl)
    {
        
$module null;
        
$dirname '';
        
$canonUrl '';

        
// Get module dirname if possible
        
if( isset($this->mRoot->mContext->mXoopsModule) ) {
            
$module =& $this->mRoot->mContext->mXoopsModule;
            
$dirname =  $module->get('dirname');
        
// Remove 'else' when adding canonical url to out-of-module page
        
} else {
            return;
        }

        
// Set canonical url by module
        
switch( $dirname ) {
        case 
'docs':
            if( 
!= (int)$contentId $this->mRoot->mContext->mRequest->getRequest('content_id') ) {
                
$canonUrl XOOPS_URL.'/'.$dirname.'/content/'.$contentId;
            } else if( 
!= (int)$catId $this->mRoot->mContext->mRequest->getRequest('cat_id') ){
                
$canonUrl XOOPS_URL.'/'.$dirname.'/cat/'.$catId;
            }
            break;
        default:
        }

        if( 
'' == $canonUrl )
            return;

        
// Add canonical url info to <{$xoops_module_header}>
        
$xoopsModuleHeader 
            ( 
'' != $xoopsTpl->get_template_vars('xoops_module_header') )
            ? 
$xoopsTpl->get_template_vars('xoops_module_header')."\n"
            
'';
        
$xoopsModuleHeader .= '<link rel="canonical" href="'.$canonUrl.'" />'."\n";

        
$xoopsTpl->assign('xoops_module_header'$xoopsModuleHeader);
    }
}
?>

switch文を使っているのは、今後URLを正規化するモジュールが増えたときに対応しやすくするためです。

ちなみに短縮URLでアクセスするために htaccess ファイルに次の2行を加えています:

RewriteRule ^docs/content/([0-9]+)$ /home/yuigahama/www/ki-dousen.net/html/modules/docs/index.php?content_id=$1 [L,QSA]
RewriteRule ^docs/cat/([0-9]+)$ /home/yuigahama/www/ki-dousen.net/html/modules/docs/index.php?cat_id=$1 [L,QSA]

[R]を指定していないので、ブラウザのアドレスバーに表示されるURLは短縮されたままです。このときサーバ変数には何がセットされているのか。この文書でちょっと調べてみました。

$_REQUEST['content_id']  2818
$_GET['content_id']      2818
$_GET['cat_id']          91
$_SERVER['QUERY_STRING'] content_id=2818
$_SERVER['REQUEST_URI']	 /docs/content/2818

友達に伝える
作成: 2013/10/5 by:koji
更新: 2013/10/6 by:koji


ソーシャルボタンにもCanonical URLを

Tech

「ログイン」ブロックはキャッシュをOFFに

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)