使用.htaccess获取干净的网址

时间:2013-12-05 15:21:31

标签: php regex apache .htaccess mod-rewrite

我一直坚持使用干净的网址已经有一段时间了,我希望能在这里得到一些帮助,希望能有一些解决方案。

更新

这是我目前的导航@anubhava

$select_category = mysql_query("SELECT * FROM menu WHERE hidden = 0 ORDER BY menu ASC");
while ($ln = mysql_fetch_array($select_category)) {
  $idcat = $ln['nmr'];
  $catname = $ln['menu'];
  $catsname = str_replace(' ', '-', $ln['menu']);

  echo '<li>';
  if($catname == "a certain category"){
  echo '<a href="http://mywebsite.aurl.net/" title="'.$catname.'"><span><strong>'.$catname.'</strong></span></a>'. PHP_EOL;
     }else{
  echo '<a href="http://www.mywebsite.com/cats/'.$idcat.'/'.$catsname.'/" title="'.$catname.'"><span><strong>'.$catname.'</strong></span></a>'. PHP_EOL; // if the user press on a main category it will stay open using GET[] on $idcat in categorymain.php
     }
  echo '<ul';


  if(isset($_GET['cats']) && $_GET['cats'] == $idcat){
    echo ' style="display:block;">'. PHP_EOL;
  }else{
    echo '>'. PHP_EOL;
  }

  $select_sub = mysql_query("SELECT * FROM submenu WHERE nmrmenu = '$idcat' AND hidden = 0");
  while ($lsub = mysql_fetch_array($select_sub)) {
      $subname = $lsub['submenu'];
    $subsname = str_replace(' ', '-', $lsub['submenu']);
    $pil = '&raquo;';
    $brnr = $lsub['nmr'];

    if(isset($_GET['cat'])){
    if ($_GET['cat'] == $brnr){
        $subname = '<u>'.$lsub['submenu'].'</u>'; // here the subcategory gets underlined if the user press on a sub category in category.php

    }else{
        $subname = $lsub['submenu'];
    }
    }

    echo '<li><a href="http://www.mywebsite.com/cat/'.$lsub['nmr'].'/'.$idcat.'/'.$subsname.'/"><span><strong> '.$pil.' '.$subname.' </strong></span></a></li>'. PHP_EOL; // here i send both main and sub category id so i can keep the main category opened and the underlined sub category when a user has pressed it.
  }

  echo '</ul>'. PHP_EOL;
  echo '</li>'. PHP_EOL;
   }

/更新

目前我在htaccess中的代码如下所示:

RewriteCond %{REQUEST_URI} cats/(.*)/
RewriteRule ^cats/([a-zA-Z0-9]+)/(.*)/$ /categorymain.php?cats=$1&mcn=$2

显示如下:www.xxxxx.com/cats/x/the_main_category/并且它不是很好。

我的目标是:www.xxxxx.com/the_main_category /

我甚至得到了这个:

RewriteCond %{REQUEST_URI} cat/(.*)/
RewriteRule ^cat/([a-zA-Z0-9]+)/(.*)/(.*)/$ /category.php?cat=$1&cats=$2&cn=$3

显示如下:www.xxxxx.com/cat/x/x/the_sub_category/,这真的不太好。

我的目标是:www.xxxxx.com/the_sub_category /

最后我有这个非常可怕的路线:

RewriteCond %{REQUEST_URI} id/(.*)/
RewriteRule ^id/([a-zA-Z0-9]+)/(.*)/(.*)/(.*)/$ /product.php?id=$1&cat=$2&cats=$3&pn=$4

显示如下:www.xxxxxx.com/id/xxxx/x/x/the_product/ horrid :O

我的目标是:www.xxxxx.com/the_product /

如果你能帮我解决这个问题,我会非常高兴

这么多变量的原因是因为我在导航中使用它们,因此用户可以轻松地查看他们在电子商店中的位置(如果他们想要返回),也可以在类别和产品上方进行“内部”导航他们不必在必要时使用侧面导航。

3 个答案:

答案 0 :(得分:1)

根据您的评论,请尝试以下规则:

RewriteEngine On

RewriteRule ^([\w-]+)/([0-9]+)/?$ /product.php?id=$2&pn=$1 [L,NC,QSA]

这将支持URI结构:/productname/123在内部重写为/product.php?id=123&pn=productname

答案 1 :(得分:0)

基本上你需要的是一个“slug”,它是每个类别的唯一标识符字符串。如果类别名称是“Food Stuff”,则您的唯一slug需要是URL的“食物”。一旦你建立了这些独特的slu,就改变你的脚本来查找slug &cat=food-stuff而不是数据库中的ID。

从这里开始,它非常简单,你可以使用你的重写规则来完成你想要的结果。

RewriteCond %{REQUEST_URI} /(.*)/
RewriteRule ^/([a-zA-Z0-9]+)/(.*)/$ /categorymain.php?cats=$1&mcn=$2

答案 2 :(得分:0)

听起来你真正需要的是简单地将所有内容传递到一个位置:

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

然后,您将在PHP中解析所请求的URL,并确定是否请求了主要类别,子类别或产品(通过与数据库等进行比较)。

我明白你想要&#34;清洁&#34;网址,但限制您的网址仅限于文字只有在每个主要类别,子类别和产品名称都是唯一的情况下才有效,而这肯定是不现实的。您的原始设计/ some_id / some_name /非常好。在URL中加上一个数字并不会使它“不干净”。&#34;