404 ページのカスタマイズ

困った時はこちらで質問してください。回答を担当する人は特に決まっていませんので、分かる方は回答をお願いします。
アバター
EXP55555
記事: 5
登録日時: 2013/10/06 12:10

404 ページのカスタマイズ

投稿記事by EXP55555 » 2013/10/06 12:53

いつもお世話になっております。Zen Cart 1.3.0.2-l10n-jp-6を使用させていただいております。近頃、Google などでも話題に上がる「ソフト404」について、カスタマイズを加えたいと思い、皆様のお知恵を拝借できたら、と思い、投稿させていただきました。

私のZen Cartでは「ショップドメイン/インストールディレクトリ/55」など、存在しないディレクトリでアクセスした場合、index.php?main_page=page_not_foundが表示され、HTTP Response Headerでも302など(本来は404ですが、リダイレクトされているため)のHTTP レスポンスが返されるため、問題ありません(これをパターンAとします)

次に「ショップドメイン/インストールディレクトリ/index.php?main_page=product_info&products_id=XXXX」といった商品ページで id だけを任意の実際には存在しない数字に変えてアクセスした場合、/languages/japanese/ などでセットされた「ページが見つかりません」などの文言が表示されます。こちらは見た目には404ですが、実際には問題なく表示され、HTTP Response Headerでもレスポンスが返されていません(これをパターンBとします)

これでは閲覧者にとっては内容がなく、無意味なページが404ページとならず、Googleウェブマスターツールなどで見ても、クロールエラーとして古いページが山のように溜まっていきます(削除してもすぐに復活します) Google公式では「問題ない」とされているものの、無駄なページをクロールさせる手間を修正しないのはウェブマスターとしてどうかとは思います。

そこで私は二つの方法を考えました。

1. 存在しないページでのアクセスはすべてindex.php?main_page=page_not_foundにリダイレクトさせる

2. サーバー公式の方法で404ページを単独で設置し、.htaccessで存在しないページへのアクセスはすべてこちらを表示させる

理想としては2. の方法なのですが、パターンBの場合のカスタマイズ方法が思いつきません。具体的には、存在しない商品のアドレスで「ページを表示させない」ように動きに変更する必要があると思います。こちらは各ファイルをチェックしているのですが、どこで大元の動きを指定しているのか、発見できずに困っている次第です。

長文失礼いたしました。以上のカスタマイズについての考察、カスタマイズ方法、ご意見など、なんでも結構ですので、お便りいただければと思います。皆様方のお知恵をお貸しください。宜しくお願いいたします。
アバター
きたきつね
記事: 147
登録日時: 2007/11/02 08:58

Re: 404 ページのカスタマイズ

投稿記事by きたきつね » 2013/10/07 09:31

Zencartの基本機能として
一般設定 - ショップ全般の設定 - リンク切れページのチェック(MISSING_PAGE_CHECK)という機能があります。
これは実際に存在しない main_page=XXXXX が呼ばれた時に動作するものです。
1.3.8ではきちんと404ヘッダを出力するようにしているのですが手元にあるv1.3.0.2-l10n-jp-6では該当ヘッダの出力がないので追加する必要があります。
この定義の書いているファイルの場所は
/includes/init_includes/init_sanitize.php
です。

コード: 全て選択

    } elseif (MISSING_PAGE_CHECK == 'Page Not Found') {
      $_GET['main_page'] = 'page_not_found';
    }
の部分を

コード: 全て選択

    } elseif (MISSING_PAGE_CHECK == 'Page Not Found') {
      header('HTTP/1.1 404 Not Found');
      $_GET['main_page'] = 'page_not_found';
    }
に変更すれば設定値で Page Not Found を指定する事で自動的に404ヘッダを出力して page_not_found が表示されます。

商品詳細ページでの存在しない商品IDへのアクセスも
/includes/modules/pages/product_info/main_template_vars.php

コード: 全て選択

    $tpl_page_body = '/tpl_product_info_noproduct.php';
の下辺りに

コード: 全て選択

header('HTTP/1.1 404 Not Found');
を追記すれば404ヘッダを出力するようになります。

>2. サーバー公式の方法で404ページを単独で設置し、.htaccessで存在しないページへのアクセスはすべてこちらを表示させる
これを実装するには上記変更部分で404ヘッダを出力して終わるのではなく、カスタマイズした404ページを読み込ませて対応する方法も有るでしょうね。

上記内容は実際にv1.3.0.2-l10n-jp-6に適応して検証した訳では無いので適応は十分に注意して行ってください。
あなたも私も一般人
( ^ω^) 照れるので様は止めてね
http://zencart-pro.com/
http://bigmouse.jp/
アバター
EXP55555
記事: 5
登録日時: 2013/10/06 12:10

Re: 404 ページのカスタマイズ

投稿記事by EXP55555 » 2013/10/07 11:45

きたきつね さん

早速のレス、心より感謝いたします。詳細な検証、アドバイスをいただき、痛み入ります。さすがプロの方ですね。 init_sanitize.php はまったく眼中にありませんでした。早速、試させていただきました。main_template_vars.phpのほうで、つまづいてしまいました。存在しない商品IDへアクセスしますと次のようなエラーが出ました。

コード: 全て選択

Warning: Cannot modify header information - headers already sent by
(output started at /includes/modules/pages/product_info/jscript_main.php:28)
in /includes/modules/pages/product_info/main_template_vars.php on line 34
 (ディレクトリ箇所は端折りました。28行目は下記二個目の window.open~、34行目はカスタマイズ箇所になります)

jsscript_main.phpは単純な内容でして

コード: 全て選択

?>
<script language="javascript" type="text/javascript"><!--
function popupWindow(url) {
  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,
status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,
width=100,height=100,screenX=150,screenY=150,top=150,left=150')
}
function popupWindowPrice(url) {
  window.open(url,'popupWindow','toolbar=no,location=no,directories=no,
status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,
width=600,height=400,screenX=150,screenY=150,top=150,left=150')
}
//--></script>


との内容だけです。ヘッダー情報を送っているようには見えないのですが、何が原因でこうなるのでしょうか?たびたびで恐れ入りますが、ご教授いただけましたら幸いです。宜しくお願いいたします。
アバター
きたきつね
記事: 147
登録日時: 2007/11/02 08:58

Re: 404 ページのカスタマイズ

投稿記事by きたきつね » 2013/10/07 13:37

失礼しました。
main_template_vars.phpは呼びこむタイミング的にheaderを出力するとエラーになりますね。
極力記述量を減らすために本来と違った場所に出すように書いてしまいました。
main_template_vars.phpの方の記述は削除して
/includes/modules/pages/product_info/header_php.php
を変更してください。
※参考のために1.3.9hの該当ファイルを添付します。
今までの会話の内容からいって、スクリプトを見れば理解できるものと思いますので、差分をチェックして適応してください。

>との内容だけです。ヘッダー情報を送っているようには見えないのですが、何が原因でこうなるのでしょうか?
この内容を echo した後にヘッダを出力しようとしたのでエラーになっています。
添付ファイル
header_php.zip
(1.01 KiB) ダウンロード数: 279 回
あなたも私も一般人
( ^ω^) 照れるので様は止めてね
http://zencart-pro.com/
http://bigmouse.jp/
アバター
EXP55555
記事: 5
登録日時: 2013/10/06 12:10

Re: 404 ページのカスタマイズ

投稿記事by EXP55555 » 2013/10/07 14:04

きたきつね さん

早速のレス、大変有難うございました。ファイルまで貼付していただき、痛み入ります。早速試してみました。結果・・・

バッチリです!見事に404エラーが返されるようになりました。header_php.php ですが、差分は前半部分に内容が追加されているだけのものだったため、そのまま適用することができました。これでGoogle ウェブマスターツールのクロールエラーも全滅させることができると思います。

Zen Cart もやはり新しいものはちゃんと進化しているんですねえ。新しいバージョン(御社販売のものも、もちろん)への移行を真剣に検討する気になりました。私も平素、デザインのカスタマイズばかりに気を取られて、こういった根本の部分を軽視しがちなので、反省しきりです。

今回は本当に有難うございました。きたきつねさんのご多幸を心よりお祈りしております。
アバター
EXP55555
記事: 5
登録日時: 2013/10/06 12:10

Re: 404 ページのカスタマイズ

投稿記事by EXP55555 » 2013/10/07 17:31

たびたび失礼いたします。気づいた点がありましたので、追記いたします。

ドメイン/インストールディレクトリ/xxx と存在しないページにアクセスした場合、index.php?main_page=page_not_found が表示されますが、この際に返されるのは「302」になり、いわゆる「ソフト404」の状態となります。Googleによれば、これは本来404とされるはずの無用なページが存在することになり、まずい状態との見解が出ています。そこで、ここもカスタマイズをしてみました。

/includes/modules/pages/page_not_found にあるheader_php.php をきたきつねさんのご教授同様にカスタマイズします。具体的には以下のコードを追加しました。

コード: 全て選択

  // if specified product_id is disabled or doesn't exist, ensure that metatags and breadcrumbs don't share inappropriate information
  $sql = "select count(*) as total
          from " . TABLE_PRODUCTS . " p, " .
                   TABLE_PRODUCTS_DESCRIPTION . " pd
          where    p.products_status = '1'
          and      p.products_id = '" . (int)$_GET['products_id'] . "'
          and      pd.products_id = p.products_id
          and      pd.language_id = '" . (int)$_SESSION['languages_id'] . "'";
  $res = $db->Execute($sql);
  if ( $res->fields['total'] < 1 ) {
    unset($_GET['products_id']);
    unset($breadcrumb->_trail[sizeof($breadcrumb->_trail)-1]['title']);
    header('HTTP/1.1 404 Not Found');
  }

  // ensure navigation snapshot in case must-be-logged-in-for-price is enabled
  if (!$_SESSION['customer_id']) {
    $_SESSION['navigation']->set_snapshot();
  }


これで404エラーとなり、クロール時にも存在しないページとして正常に認識されるようになります。閲覧者の方にも有益かと思い、以上、追記させていただきます。
アバター
かず
記事: 196
登録日時: 2005/5/21 15:31
お住まい: 愛知県

Re: 404 ページのカスタマイズ

投稿記事by かず » 2013/10/07 22:57

お二方ともありがとうございます。
私も以前から気になってはいたんですが、どうすることもできなくてスルーしてました。
落ち着いて時間の取れるときに、真似してカスタマイズしてみます。m(_ _)m
アバター
EXP55555
記事: 5
登録日時: 2013/10/06 12:10

Re: 404 ページのカスタマイズ

投稿記事by EXP55555 » 2013/10/07 23:32

かずさん ぜひ頑張ってみてください。ちなみに私の場合ですが、上記以外に次のカスタマイズを加えています。

コード: 全て選択

ErrorDocument 404 http://ドメイン/インストールディレクトリ/index.php?main_page=page_not_found


上記内容の.htaccessファイル(ただのテキストファイル)を作り、インストールディレクトリにアップロードし、管理画面の 一般設定 - ショップ全般の設定 - リンク切れページのチェック を「Page Not Found」に設定しておきます。

一点だけ気になるのが、このカスタマイズを行うと、追加設定ツール - オンラインユーザーのチェックの画面を閲覧しても、実際のページが表示されずに、すべて index.php?main_page_not_found になってしまうことでしょうか。Google Anlytics の「リアルタイム 」「 サマリー」 でモニターできるので不便はありませんが・・・。 以上、参考になさってください。

“Zen Cart 質問コーナー” へ戻る