【问题标题】:.htaccess and seo-friendly urls.htaccess 和 seo 友好的网址
【发布时间】:2010-10-24 15:04:45
【问题描述】:

我们现在有一个电子商务网站,其中包含一系列品牌。品牌页面的网址如下:

  1. http://www.<DOMAIN>.com/catalog/brand/view?id=2

我们需要使用更友好(seo-friendly)的网址,例如:

  1. http://www.<DOMAIN>.com/<BRAND>

但是这样它会解决上面的#1。

这是在根目录下的 .htaccess 文件中完成的吗?如果是这样,正确的方法是什么?

请记住 URL#1 是合法地址,但我们希望使用 URL#2 格式进行链接。这不是 301 类型的重定向吗?除非我误解了它或其他什么,否则这更“永久”,不是吗?

非常感谢。

【问题讨论】:

    标签: apache seo url-routing


    【解决方案1】:

    您正在寻找的 apache 功能称为mod_rewrite。您应该可以通过 Google 搜索并在此处找到很好的帮助资源。

    基本思想是您将指定一个正则表达式匹配,然后指定一个替换模式。可以设置做301重定向,但默认是不重定向用户,直接访问重写后的url。

    这是一个例子:

    RewriteEngine On
    RewriteRule (.*) index.php
    

    RewriteRule 表示将任何匹配的 url(.*) 重写为 index.php。这对大多数文件不是特别有用。我相信你会有很多例子,因为这是一个常见的问题。

    【讨论】:

      【解决方案2】:

      除非您认为品牌名称可能会更改,否则您需要进行 2 次重写,一次作为重定向,一次是内部:

      RewriteRule ^catalog/brand/view?id=2 /<BRAND> [R=301,L]
      RewriteRule ^<BRAND> /catalog/brand/view?id=2
      

      这意味着浏览器/蜘蛛总是会看到漂亮的 URL,而您的应用程序会看到真实的。

      【讨论】:

      • 格雷格 - 谢谢。我相信这就是我一直在寻找的。我在代码中看到“301”——这不是永久的“重定向”或类似的东西,对吧?我认为301与此有关。 :)
      【解决方案3】:

      您可以通过在索引上添加 .htaccess 或在 httpd.conf 中进行配置来实现。

      Here你有一个可以帮助你的工具。你需要的是一个变形器

      我希望这对您有所帮助..您需要进行一些修改...:P

      define('SEO_HOST', "http://www.example.com");
      define('SEO_ITEM_PATTERN', SEO_HOST . '/%s-prod-%s');
      define('SEO_CATEGORY_PATTERN', SEO_HOST . '/%s-cat-%s');
      define('SEO_COMBO_PATTERN', SEO_HOST . '/%s-combo-%s');
      
      class Seo {
          function seems_utf8($Str) { # by bmorel at ssi dot fr
              $length = strlen($Str);
              for ($i=0; $i < $length; $i++) {
                  if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
                  elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
                  elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
                  elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
                  elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
                  elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
                  else return false; # Does not match any model
                  for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
                      if ((++$i == $length) || ((ord($Str[$i]) & 0xC0) != 0x80))
                          return false;
                  }
              }
              return true;
          }
      
          function get_beauty_url_string($string) {
              if ( !preg_match('/[\x80-\xff]/', $string) )
                  return self::replace_no_alpha_chars($string);
      
              if (self::seems_utf8($string)) {
                  $chars = array(
                      // Decompositions for Latin-1 Supplement
                  chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
                      chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
                      chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
                      chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
                      chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
                      chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
                      chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
                      chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
                      chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
                      chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
                      chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
                      chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
                      chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
                      chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
                      chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
                      chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
                      chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
                      chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
                      chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
                      chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
                      chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
                      chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
                      chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
                      chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
                      chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
                      chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
                      chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
                      chr(195).chr(191) => 'y',
                      // Decompositions for Latin Extended-A
                  chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
                      chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
                      chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
                      chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
                      chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
                      chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
                      chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
                      chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
                      chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
                      chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
                      chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
                      chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
                      chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
                      chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
                      chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
                      chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
                      chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
                      chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
                      chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
                      chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
                      chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
                      chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
                      chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
                      chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
                      chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
                      chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
                      chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
                      chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
                      chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
                      chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
                      chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
                      chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
                      chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
                      chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
                      chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
                      chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
                      chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
                      chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
                      chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
                      chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
                      chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
                      chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
                      chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
                      chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
                      chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
                      chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
                      chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
                      chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
                      chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
                      chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
                      chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
                      chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
                      chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
                      chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
                      chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
                      chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
                      chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
                      chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
                      chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
                      chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
                      chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
                      chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
                      chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
                      chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
                      // Euro Sign
                  chr(226).chr(130).chr(172) => 'E',
                      // GBP (Pound) Sign
                  chr(194).chr(163) => '');
      
                  $string = strtr($string, $chars);
              } else {
                  // Assume ISO-8859-1 if not UTF-8
                  $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
                      .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
                      .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
                      .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
                      .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
                      .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
                      .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
                      .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
                      .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
                      .chr(252).chr(253).chr(255);
      
                  $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
      
                  $string = strtr($string, $chars['in'], $chars['out']);
                  $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
                  $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
                  $string = str_replace($double_chars['in'], $double_chars['out'], $string);
              }
      
              return self::replace_no_alpha_chars($string);
          }
      
          function replace_no_alpha_chars($url) {
              $url = strtolower(ereg_replace("[^a-zA-Z0-9]","-",trim($url))); 
              // Saca los guiones repetidos 
              $url = strtolower(ereg_replace('-+','-',($url))); 
      
              // Saca el último guión en caso de que termine con uno 
              if ($url[strlen($url)-1] == '-') $url = substr($url, 0, strlen($url)-1); 
      
              return $url;
          }
      
      
          function get_item_url($title, $id, $category = '') {
              $beauty_category = $beauty_title = ''; 
              $beauty_title = self::get_beauty_url_string($title);
              if (strlen($category))
                  $beauty_category = self::get_beauty_url_string($category);
      
              $url = sprintf(SEO_ITEM_PATTERN, (strlen($beauty_category) ? "{$beauty_category}/" : "") . $beauty_title, $id);
      
              return $url;
          }
      
          function get_category_url($title, $id) {
              $beauty_title = self::get_beauty_url_string($title);
      
              $url = sprintf(SEO_CATEGORY_PATTERN,$beauty_title, $id);
      
              return $url;
          }
      
          function get_combo_url($title, $id) {
              $beauty_title = self::get_beauty_url_string($title);
      
              $url = sprintf(SEO_COMBO_PATTERN,$beauty_title, $id);
      
              return $url;
          }
      }
      

      你可以这样使用它:

      <a ref="<?= Seo::get_category_url("my super category",10)?>">My super category</a>
      

      你会得到:http://www.example.com/my-super-category-cat-10

      当然还有我的 .htaccess:

      RewriteRule ^(.*)-cat-([0-9]+)$ /simple/index.php?categoria_id=$2&estado=mostrar_categoria [L,QSA]
      RewriteRule ^(.*)-combo-([0-9]+)$ /simple/index.php?producto_id=$2&estado=mostrar_combo [L,QSA]
      RewriteRule ^(.*)-prod-([0-9]+)$ /simple/index.php?producto_id=$2&estado=mostrar_producto [L,QSA]
      

      【讨论】:

      • Gabriel - 感谢您的响应/代码 - 但这可能比我认为的需要多一点(更不用说我的头了。:)
      • jejeje,让我有点不同意:你需要一些这样的代码来拥有美丽的 url,如果不是,一些字符将被 urlencoded,例如“”(空格)将被转换为 %20。在这种情况下,您只需将其更改为“-”无论如何也请尝试我在上面发布的链接。问候(问候)
      猜你喜欢
      • 2016-03-11
      • 2017-05-14
      • 2014-07-26
      • 2016-02-02
      • 2013-03-20
      • 2012-09-02
      • 2011-07-23
      • 2011-04-06
      • 2014-01-14
      相关资源
      最近更新 更多