Url rewrite et caractére spéciaux

Consultez la formation URL Rewriting et sites dynamiques de WebRankInfo / Ranking Metrics

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Url rewrite et caractére spéciaux

Message le Jeu Déc 30, 2004 14:45

Bonjour tout le monde,

j'espére que les fetes ont été bonne pour tout le monde :wink:

je suis nouveau sur le forum, mais je sens que je vais devenir un habitué

voila donc ma question =>

je suis en train d'effectuer de l'url rewriting sur mon site internet, tout fonctione exepté quelques petites choses.

j'utilise comme séparateur le -

et voici mes problèmes =>

* si un article est appelé alors qu'il contient un - dans son nom, IE m'affiche impossible d'afficher la page
* ensuite je n'arrive pas a supprimer les caractéres spéciaux comme ()'&%$ etc... ce qui me fait des %2B et autres dans l'url sur certain produits.

Donc comment puis je remedier a ce problème.

voici mon .htaccess en test
Code: Tout sélectionner
Options +FollowSymLinks
    RewriteEngine    on
    RewriteBase     /test
    RewriteRule      admin                      - [L]
    RewriteRule      test$            /test/index.php [R,L]
    RewriteRule      test/$           /test/index.php [R,L]
    RewriteCond      %{REQUEST_URI}             !-d
    RewriteCond      %{REQUEST_URI}             !^/$
    RewriteRule      !\.(gif|php|css|js|jpg)$      /test/rewrite.php
    RewriteRule        .*      - [F]


ensuite voici le contenu de mon fichier rewrite.php

Code: Tout sélectionner
<?php

include('includes/application_top.php');
 
if ($REQUEST_URI == '/catalog/') {
   tep_redirect(tep_href_link(FILENAME_DEFAULT));
}

if ($REQUEST_TYPE == 'SSL') {
   $comparison_array = explode('/', HTTPS_SERVER . DIR_WS_HTTPS_CATALOG, 4);
} else {
   $comparison_array = explode('/', HTTP_SERVER . DIR_WS_HTTP_CATALOG, 4);
}
$comparison = $comparison_array[3];

$parts = explode('?', str_replace($comparison, '', $REQUEST_URI), 2);
$list = explode('/', preg_replace(array('#^/#', '#/$#'), '', $parts[0]));
if (sizeof($parts) == 2) {
   $parameters = explode('&', $parts[1]);
   foreach ($parameters as $pair) {
     $pieces = explode('=', $pair);
     $HTTP_GET_VARS[$pieces[0]] = $pieces[1];
   }
}
$current_category_id = 0;
$cPath_array = array();
$count = 0;
foreach ($list as $piece_encoded) {
   $count++;
   $piece = urldecode(preg_replace(array('/[-]/', '/%20/'), array(' ', '%2F'),$piece_encoded));
   if ($piece == 'catalog') {
     continue;
   }
   $query_string = "select cd.categories_id from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_name='" . tep_db_input($piece) . "' and c.parent_id='" . (int)$current_category_id . "'";
   $category_query = tep_db_query("select cd.categories_id from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_name like '" . tep_db_input($piece) . "' and c.parent_id='" . (int)$current_category_id . "'");
   if ($category_array = tep_db_fetch_array($category_query)) {
     $cPath_array[]= $category_array['categories_id'];
     $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', $cPath_array)));
     $current_category_id = $category_array['categories_id'];
   } else {
     if ($current_category_id != '0') {
       $parent_where_string = " and p2c.categories_id='" . (int)$current_category_id . "'";
     } else {
       $parent_where_string = '';
     }
     $product_query = tep_db_query("select pd.products_id from products_description pd, products_to_categories p2c, products p where p.products_id = pd.products_id and p.products_status = '1' and pd.products_id=p2c.products_id and pd.products_name='" . tep_db_input($piece) . "'" . $parent_where_string);
     if ($product_array = tep_db_fetch_array($product_query)) {
       if (sizeof($cPath_array) < 1) {
         $cPath = tep_get_product_path($product_array['products_id']);
         $cPath_array = explode('_', $cPath);
         for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
           $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
           if (tep_db_num_rows($categories_query) > 0) {
             $categories = tep_db_fetch_array($categories_query);        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
           } else {
             break;
           }
         }
       } else {
         $cPath = implode('_', $cPath_array);
       }
       $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $product_array['products_id']));
       $HTTP_GET_VARS['products_id'] = $product_array['products_id'];
       $PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_PRODUCT_INFO;
$PHP_SELF = mrpropre($PHP_SELF_REWRITE);
       include(FILENAME_PRODUCT_INFO);
       exit();
     } else {
       $manufacturer_query = tep_db_query("select manufacturers_id from manufacturers where manufacturers_name='" . tep_db_input($piece) . "'");
       if ($manufacturer_array = tep_db_fetch_array($manufacturer_query)) {
         $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', $cPath_array) . 'manufacturers_id=' . (int)$manufacturers_array['manufacturers_id']));
         $HTTP_GET_VARS['manufacturers_id'] = $manufacturer_array['manufacturers_id'];
         if ($count == sizeof($list)) {
           $HTTP_GET_VARS['filter_id'] = $current_category_id;
           $PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_DEFAULT;
  $PHP_SELF = mrpropre($PHP_SELF_REWRITE);
           $cPath = implode('_', $cPath_array);
           $HTTP_GET_VARS['cPath'] = $cPath;
           include(FILENAME_DEFAULT);
           exit();
         }
       } else {
         reset($list);
         /* tep_redirect(tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, 'keywords=' . implode('+', $list))); */
       }
     }
   }
}
$cPath = implode('_', $cPath_array);
$HTTP_GET_VARS['cPath'] = $cPath;
$PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_DEFAULT;
$PHP_SELF = $PHP_SELF_REWRITE;
include(FILENAME_DEFAULT);
?>


et le fichier effectuant l'affichage html_output.php

Code: Tout sélectionner
<?php
// The HTML href link wrapper function
  function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
    global $request_type, $session_started, $SID;

    $separator = '?';
    if (tep_not_null($parameters)) {
      $product_name = '';
      switch ($page) {
        case FILENAME_PRODUCT_INFO:
        case FILENAME_DEFAULT:
          $manufacturer_name = '';
          $product_name = '';
          $new_parameter_list = array();
          $cPath_list = array();
          foreach (explode('&', $parameters) as $pair) {
            global $languages_id;
            $pair_array = explode('=', $pair);
            switch ($pair_array[0]) {
              case 'action':
                $link .= $page . '?' . tep_output_string($parameters);
                $separator = '&';
                break 3;
              case 'cPath':
                $parent_id = 0;
                foreach (explode('_', $pair_array[1]) as $category_id) {
                  $category_name_query = tep_db_query("select cd.categories_name from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_id='" . (int)$category_id . "' and cd.language_id='" . (int)$languages_id . "' and c.parent_id='" . (int)$parent_id . "'");
                  if ($category_name_array = tep_db_fetch_array($category_name_query)) {
                    $cPath_list[]= urlencode(strtolower(mrpropre($category_name_array['categories_name'])));
                    $parent_id = $category_id;
                  }
                }
                break;
              case 'products_id':
                $product_name_query = tep_db_query("select products_name from products_description where products_id='" . (int)$pair_array[1] . "' and language_id='" . (int)$languages_id . "'");
                if ($product_name_array = tep_db_fetch_array($product_name_query)) {
                  $product_name = strtolower(mrpropre($product_name_array['products_name']));
                }
                break;
              case 'manufacturers_id':
                $manufacturer_name_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id='" . (int)$pair_array[1] . "'");
                if ($manufacturer_array = tep_db_fetch_array($manufacturer_name_query)) {
                  $manufacturer_name = strtolower(mrpropre($manufacturer_array['manufacturers_name']));
                }
                break;
              case '':
                break;
              default:
                if (tep_not_null($pair)) $new_parameter_list[]= $pair;
            }
          }
          if (tep_not_null($manufacturer_name)) {
            $cPath_list[]= urlencode($manufacturer_name);
          }
          if (tep_not_null($product_name)) {
            $cPath_list[]= urlencode($product_name);
          }
          $separator = '?';
          $link .= preg_replace(array('/%2F/', '/[+]/'), array('%20', '-'), implode('/', $cPath_list));
          if (tep_not_null($new_parameter_list)) {
            $link .= $separator . implode('&', $new_parameter_list);
            $separator = '&';
          }
          break;
        default:
          $link .= $page . '?' . tep_output_string($parameters);
          $separator = '&';
      }
    } else {
      $link .= $page;
      $separator = '?';
    }

    if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
      while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

      $link = str_replace('?', '/', $link);
      $link = str_replace('&', '/', $link);
      $link = str_replace('=', '/', $link);

      $separator = '?';
    }

    if (isset($_sid)) {
      $link .= $separator . $_sid;
    }

    return $link;
  }

?>


la fonction qui j'utilise pour supprimer les caractéres accentués et celle ci

Code: Tout sélectionner
function mrpropre($chaine){
   $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
   $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
   return(strtr($chaine,$tofind,$replac));
   }


Je travail depuis plusieurs jour sur ce problème mais impossible de trouver une solution. Ce qui est normal car je ne suis pas un pro du php :lol:

Donc j'attend vos avis, etc... tout ce qui puisse me faire avancé dans mon shmilblic... (excusé moi pour l'orthographe).

Merci d'avance et bonne fete de fin d'année a tous.

++
Dernière édition par fab27 le Lun Jan 03, 2005 0:38, édité 2 fois.


maxttb
WRInaute impliqué
WRInaute impliqué
 
Messages: 477
Inscription: Ven Fév 27, 2004 16:36

Message le Jeu Déc 30, 2004 15:39

function mrpropre! Joli ;-)
Sinon, pour supprimer les caractères spéciaux, fait une regex à partir de [^\w\-] à la fin de la fonction Mr Propre, ca supprimera tous les caractères différents de a-z, A-Z, 0-9, _ et -
ereg_replace("[^\w\-]", "", $string)

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Ok mais je fais comment

Message le Jeu Déc 30, 2004 15:50

Sinon, pour supprimer les caractères spéciaux, fait une regex à partir de [^\w\-] à la fin de la fonction Mr Propre, ca supprimera tous les caractères différents de a-z, A-Z, 0-9, _ et -
ereg_replace("[^\w\-]", "", $string)


Merci pour cette réponse ultra rapide

ok je suis d'accord avec toi :D , mais je fais comment ?

++


maxttb
WRInaute impliqué
WRInaute impliqué
 
Messages: 477
Inscription: Ven Fév 27, 2004 16:36

Message le Jeu Déc 30, 2004 15:58

Tu places ca à la fin de ta fonction Mr Propre, et ca règle le problème des caractères spéciaux... Par contre, je n'ai pas vraiment saisi l'autre problème...
Donne-nous des exemples histoire de clarifier les choses... Je connais peu de monde qui va s'amuser à lire tout ton code...


totoro
WRInaute passionné
WRInaute passionné
 
Messages: 908
Inscription: Mer Juil 28, 2004 14:12

Message le Jeu Déc 30, 2004 16:04

Bienvenue dans ce forum,
Effectivement ton post est comment dire... bcp trop long.

Dans ce genre de cas, essaye d'isoler le pb, ou d'expliquer un minimum avant de balancer un code comme ca.

Mais c'est pas grave, l'essentiel et de trouver son bonheur ici ;)

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Message le Jeu Déc 30, 2004 16:04

je fais comme cela

Code: Tout sélectionner
function mrpropre($chaine){
   $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
   $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
   strtr($chaine,$tofind,$replac);
   return(ereg_replace("[^\w\-]", "", $chaine));
   }


Est ce bien cela ?

sinon pour mon autre problème, c'est que certain de mes produits ont des - dans leurs noms => exemple : produit-A
avec l'url rewriting j'ai bien l'url comme ceci => produit---A mais quand je clic sur le lien en question, le produit n'est pas trouvé.

en gros je gros qu'il considére le - du milieu comme séparateur également et non comme un caractére du produit.

sinon voici quelques exemple de mes problèmes

voici une url avec un problème de caractére
Code: Tout sélectionner
http://localhost/jeux-de-roles/dungeons%26dragons


ici dungeons&dragons => le & se transforme en %26

et ici pour mon deuxieme problème
Code: Tout sélectionner
http://localhost/jeux-de-roles/dungeons%26dragons/dieux-et-demi---dieux


ici l'article s'appelle dieux et demi-dieux donc j'ai l'url ci dessus, mais si je clic sur le lien, article introuvable.

j'espere etre assez clair.

Merci encore

++

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Message le Jeu Déc 30, 2004 16:21

Pour la fonction c'est ok,

En m'aidant de ton code, et avec du code que j'avais j'ai reussi a faire quelques chose..

voici ma fonction mrpropre

Code: Tout sélectionner
function mrpropre($chaine){
$tofind = " ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]'~$&%*@ç!?;,:/\^¨€{}|+-";
$replac = "-AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn---------------------E-----";
$mrpropre =(strtr($chaine,$tofind,$replac));
$mrpropre = ereg_replace("\"","-", $mrpropre);
$mrpropre = ereg_replace("[-]{2,}", "-", $mrpropre);
return $mrpropre;
}


donc ici l'url est completement nettoyer, mais le problème étant que certain lien ne fonctionne pas (uniquement pour les produits avec des caractéres spéciaux).

bon du coup avec cette fonction

j'ai par exemple comme url ceci

http://localhost/catalog/jeux-de-roles/dungeons-dragons

donc le & est bien transformé en -.
mais comme j'utilise le - comme séparateur, il considére le - comme un séparateur et non comme un caractére du nom du produit.

j'espere que je suis assez clair...

comment je peux faire pour qu'il comprenne qu'il s'agit bien d'un caractére du produit et non du - utilisé comme séparateur.

Je pense qu'il faut faire une modification au niveau du fichier rewrite.php que je montre au debut, mais je ne sais pas par quoi commencer.

Merci encore

++
Dernière édition par fab27 le Ven Déc 31, 2004 0:52, édité 1 fois.


vpx
WRInaute accro
WRInaute accro
 
Messages: 1099
Inscription: Mar Mar 23, 2004 15:53

Message le Jeu Déc 30, 2004 16:29

Pour les caracteres speciaux, il suffit d'utiliser la fonction utf8_decode($string) , qui est faite pour cela. Pas besoin de passer par une regex compliquée.

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Message le Jeu Déc 30, 2004 16:52

Bon le problème pour nettoyer l'url est ok...

maintenant j'ai bien des urls nettoyés.

cependant comme je le dis dans mon post ci dessus.

exemple :

j'ai un produit dungeons&dragons

transformé en dungeons-dragons dans l'url

si je clic sur le lien, il ne reconnait pas le produit et j'arrive automatiquement sur la page produit non trouvé.

Donc je suppose maintenant qu'il ne reste plusqu'a faire en sorte que le caractére spéciaux une fois transformé ne soit pas considére comme le séparateur pour le rewriting mais comme le caractére d'origine.

car le problème est similaire avec les '()% ils sont bien transformé en -, mais le lien ne fonctionne pas.

Merci d'avance

++

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

le php est moi ce n'est pas pour tout de suite

Message le Ven Déc 31, 2004 0:50

Bon et bien j'arrette pour aujourd'hui, faut bien que je dorme un jour. :D

je suis vert je bosse sur ce problème depuis déja plusieurs heures et je n'ai pas avancé d'un poil ! CA M'ENERVE.....

toujours ce satané problème avec les caractéres spéciaux et les - .

Si quelqu'un peux m'aiguiller, ou me donner un petit coup de pouce je serais super content.

Encore merci

++

PS : Bon nouvel an a tous ! (en avance :lol: )

fab27
Nouveau WRInaute
 
Messages: 14
Inscription: Jeu Déc 30, 2004 14:32

Je n'y arrive pas !

Message le Lun Jan 03, 2005 0:31

Bonjour,

aprés une bataille acharné, je n'arrive toujours pas a obtenir ce que je souhaite.

Je commence a me tiré les cheuveux ....

C'est pourquoi j'en reviens a vous tous, car j'ai sérieusement besoin d'un coup de main pour faire avancé mon opération.

toujours le même problème.

j'utilise le - comme séparateur et tout mes liens qui contiennent avant le rewrite un - a l'intérieur ne fonctionne pas

exemple : j'ai un produit => toto-titi
mon lien est toto-titi (le - du produit est interpreté comme étant un séparateur alors qu'il n'en est pas un)

et quand je clic sur le lien rien ne marche (erreur 404)
il en est de même pour les caractére spéciaux que je transforme en -

Merci d'avance

PS : j'ai supprimé tout le code inutile pour le premier post (afin de le rendre plus lisible)

++
fab


Formation recommandée sur ce thème :

Formation URL Rewriting et sites dynamiques : apprenez comment mettre en place la réécriture d'URL, comment optimiser vos URL et profiter de vos pages dynamiques pour booster votre référencement. Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Co-Op

  • Calcul du nombre de backlinks
    Cet outil vous permet d'analyser en détails la "popularité" de votre site sur Google. En plus du nombre de liens pris en compte par Google, il calcule le pourcentage de liens internes parmi tous les liens, et il affiche les premières URL trouvées.
  • Transformer des citations en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités