一个Zen Cart站,安装了Ultimate SEO URLs这个SEO URL插件,这插件真是好,产品页面的URL是包含关键字、伪静态化的.html。问题是,最近很多产品改了名字,导致一个产品有两个URL,站在搜索引擎立场来看,就是产生了重复的页面。Google很生气,这就不妙了,于是赶紧的呼叫301 redirect。

Zen Cart产品页面301跳转,我修改的是下面这个文件:

includes/modules/pages/product_info/main_template_vars.php

定位到下面的代码:

  require(DIR_WS_MODULES . zen_get_module_directory('product_prev_next.php'));

  $products_name = $product_info->fields['products_name'];

替换为:

   require(DIR_WS_MODULES . zen_get_module_directory('product_prev_next.php'));

   $products_id   = $product_info->fields['products_id'];
   $products_name = $product_info->fields['products_name'];

   // 301 product url
   $enable301 = true;

   if ($enable301) {  // 301
      if (!empty($products_name)) {
         $rel_url = HTTP_SERVER . '/' . xen_encode_product_name($products_name) . '_p' . $products_id . '.html';
         $req_url = HTTP_SERVER . $_SERVER['REQUEST_URI'];

         if ($rel_url != $req_url) {
           $msg = "{$req_url} :to: {$rel_url}\n";
           $logfile = DIR_FS_CATALOG . 'log301.txt';
           error_log($msg, 3, $logfile);
           header('HTTP/1.1 301 Moved Permanently');
           header( "Location: " . $rel_url);
           exit();
         }
      } else {  // 404
         $msg = $_SERVER['REQUEST_URI'] . "\n";
         $logfile = DIR_FS_CATALOG . 'log404.txt';
         error_log($msg, 3, $logfile);
      }
   }

   function xen_encode_product_name($str) {
      $str = strtolower(preg_replace('/[^a-z0-9 ]/i', '', $str));
      $str = strtolower(preg_replace('/\W+/', '-', $str));

      while (strpos($str, '--') !== false) {
         $str = str_replace('--', '-', $str);
      }

      return trim($str, '-');
   }

上面的301跳转代码的思路是:首先,根据数据库中的Product ID, Product Name,来组合成一个实际的URL。然后,和用户请求的URL比较,如果两者不相等,则执行301跳转。另外增加了一些调试log,分别是网站根目录下的log301.txt, log404.txt,这样可以方便检测到301跳转的正确与否。对于不存在的产品URL,也记录在日志中了。不需要的时候,可以注释掉。

为了减小对Zen Cart性能的影响,可以在一段时间过后,去掉301跳转这部分逻辑。只需要修改开关变量,如下:

$enable301 = false;

相关话题:

  • Ultimate SEO URLs Zen Cart 301。
  • Zen Cart 301 Redirect。