[Tep-j-general] クローラー親和性の高いproduct_info.php

Back to archive index

hamada bungu****@leo*****
2006年 2月 20日 (月) 09:31:05 JST


こんにちわ。

osCでは、同じ商品の詳細説明(product_info.php)が

/catalog/product_info.php/products_id/1111
/catalog/product_info.php/cPath/22_33_44/products_id/1111
/catalog/product_info.php/manufacturers_id/55/products_id/1111

といった具合に複数のURLで表現出来てしまう→これらを別個のものとしてクロー
ラーが拾ってしまうので、同一の商品説明が複数のURLに重複登録されてしまう
という問題が有ります。

そして、検索エンジン側がBLOGでよく起こるこうした問題に対処を始めた→重複
登録URLに記述された情報は重さが軽くされてしまい、商品説明(←割と重要)
の検索結果順位に対して悪影響を及ぼす事が懸念されていました。

また同一URLの多種表現が可能と言う事は、検索エンジンに登録/クロールされ
るURLが不必要に多くなる事を意味し、無駄です。

2千しか商品登録されてないのに、検索エンジンに4万ページ以上インデックス
されてるとか、無駄な重複URLにクロール回数を食い潰されて肝心なURLが「パー
シャル・インデクシング」状態に留め置かれてしまったりとか。

(Googleだと「日本語のページを検索」オプションを指定すると良く解りますが、
サイトのPageRankが相当高いとかでないと、かなり沢山のURLがPartial indexing
ではないかと思います)

加えて、同一URLの表記長(バイト数)が短くて済むなら、それに越したことは
ないですよね?

長いURL=深い階層のファイルとみなされることは、SEO的に悪影響があるのかも
しれないというハナシもありましたし。

ということで、当方は従来この問題に対し

> RewriteEngine on
> RewriteBase /catalog
> 
> RewriteRule   ^product_info/.php/cPath/(.*)/products_id/(.*)     product_info.php/products_id/$2 [R=301]
> RewriteRule   ^product_info/.php/manufacturers_id(.*)products_id/(.*)     product_info.php/products_id/$2 [R=301]

↑こんな感じの記述(見直して自分でも一瞬戸惑ったので追記。正規表現と看做
されないようにするため、.を/でエスケープしてます:^^;)を

/catalog/.htaccess

に追記する事で対処し、それなりの成果を上げてきたのですが、mod_rewriteで
機械的に301するようにすると、重複登録商品(=cPath引数無しで呼び出すと所
属カテゴリが表示されない)でも無条件にリダイレクトされ、cPath引数を喪失
してしまうという問題点がありました。

重複登録商品が有る環境だと、この状況はあまり好ましくないです。重複登録商
品でcPath引数を喪失→product_info.php表示時にcategories.phpで登録カテゴ
リが示されないと、同一カテゴリの類似商品が探しにくいし。

ちうことで、今回、mod_rewriteを使うのではなくproduct_info.php側に工事を
施し、商品の登録状況に応じて動作を変えることで対処する事にしました次第。
ついでに、以前から気になってた条件つきGETにも対応してみました。

勿論これらの処理はそれぞれまったく別個のものなので、どちらかだけ選んで実
装する事も可能です。その辺はお好みでどぞ。

条件つきGET=If-Modified-Sinceへの対応には

PHP で If-Modified-Since に対応してみる
http://www.avoidnote.com/archives/2005/07/modified_since.php

↑こちらで公開されているdoConditionalGet()関数をそのまま利用させて頂きま
した。お陰ですげぇラクチンでした。大感謝。


実装手順>

1. /catalog/includes/functions/general.phpに
	・str2time()
	・doConditionalGet()
	両関数の定義部を追記。

2. /catalog/product_info.phpの

>   require('includes/application_top.php');

の下に、下記キリトリ線内を追記。

------------------------------------------------------------

//余計な引数あり&重複登録商品でない場合301リダイレクト
if ((isset($HTTP_GET_VARS['cPath']) || isset($HTTP_GET_VARS['manufacturers_id'])) && tep_not_null(tep_get_product_path($HTTP_GET_VARS['products_id']))) {

	header('Location: ' . tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $HTTP_GET_VARS['products_id']));
	header ('HTTP/1.0 301 Moved Permanently');
	exit;

}

//更新時刻を取得
$sql = "select products_last_modified from " . TABLE_PRODUCTS . " where products_id = '" .  (int)$HTTP_GET_VARS['products_id'] . "' limit 1";

$data = tep_db_fetch_array(tep_db_query($sql));

//更新時刻を返す
doConditionalGet(strtotime($data['products_last_modified']));

------------------------------------------------------------

以上でおしまいです。あいも変わらずすげぇテキトー(~_~;)


はまだ




Tep-j-general メーリングリストの案内
Back to archive index