Conflits entre deux regles - votre avis

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

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Conflits entre deux regles - votre avis

Message le Jeu Fév 09, 2006 9:29

Bonjour,

j'ai un petit soucis sur ce fichier HTACCESS. Quelqu'un plus experimenté pourrait-il me dire ce que je dois changer pour que cela fonctionne correctement ?

J'ai une erreur 500 comme ca :
Internal Server Error

Le probleme se pose sur les pages produits, j'ai plusieurs URL possible :

Code: Tout sélectionner
http://localhost/oralto/index.php?cPath=3_10&sort=2a&action=buy_now&products_id=31
(bt commander - listing)

http://localhost/oralto/product_info.php?cPath=3_10&products_id=10 (lien image
ou texte vers la fiche produit)

http://localhost/oralto/product_info.php?products_id=15 (image lien vers la
fiche produit colonne de gauche et de droite)


Du coup je suis obligé de faire plusieurs regles non ? Et je pense que ces regeles rentre en conflits. Voici mon fichier HTACCESS (voir les regles "product_info"):

Merci pour vos réponses !!!

Code: Tout sélectionner
# -FrontPage-

RewriteEngine on

RewriteRule (.*)*-c(.+)\.html$ $1/index.php?cPath=$2 [L]

RewriteRule (.*)*-p(.+)\.html$
$1/product_info.php?products_id=$2 [L]

RewriteRule ^(.*)-c([^-]+)-p([^-]+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]

RewriteRule ^(.*)-c([^-]+)-s([^-]+)-p([^-]+)\.html$
$1/index.php?cPath=$2&sort=$3&page=$4 [L]

RewriteRule (.*)*-m(.+)\.html$ $1/index.php?manufacturers_id=$2 [L]

RewriteRule (.*)designer-.*-d(.+)\.html$
$1/designers_info.php?designers_id=$2 [L]


RewriteRule (.*)notre-societe\.html$ $1compagny.php [L]
RewriteRule (.*)contactez-nous\.html$ $1contact_us.php [L]
RewriteRule (.*)meilleures-ventes\.html$ $1products_new.php [L]

RewriteRule (.*)(-.+)-([^-]+)-([^-&]*)([^-]*)\.html $1$2&$3=$4$5\.html [N]
RewriteRule (.*)-([^-]+)-([^-]*)(.*)\.html $1.php?$2=$3$4 [L]
RewriteRule ^(.*).html $1.php [L]


IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>
AuthName www.oralto.com
ErrorDocument 404 http://www.oralto.com/index.html


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Jeu Fév 09, 2006 9:34

il suffit de mettre tes regles dans le bon ordre, vu qu'elles sont executés dans leur ordre dans le htaccess, si une est plus précise que la seconde, la passer avant

exemple :

rewrite toto-(.+)-(.+).html
avant
rewrite toto-(.+).html


kimengumi
WRInaute discret
WRInaute discret
 
Messages: 115
Inscription: 9 Nov 2005

Message le Jeu Fév 09, 2006 9:40

[HS] : sympa les objets proposés sur ton site

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Fév 09, 2006 10:15

kimengumi >> merci ;)

e-kiwi >> ça voudrait dire que je dois mettre ces regles ci-dessous :
Code: Tout sélectionner
RewriteRule (.*)*-p(.+)\.html$
$1/product_info.php?products_id=$2 [L]

RewriteRule ^(.*)-c([^-]+)-p([^-]+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]


Dans cet ordre la :

Code: Tout sélectionner
RewriteRule ^(.*)-c([^-]+)-p([^-]+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]

RewriteRule (.*)*-p(.+)\.html$
$1/product_info.php?products_id=$2 [L]



ça veux dire que tu ne vois aucun probleme sur mes regles ?


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Jeu Fév 09, 2006 11:23

autre hors sujet :

tu n'as pas regardé si il n y avait pas de module de URL Rewriting tout fait pour Oscommerce qui gererai toutes tes URL / Regles ?

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Fév 09, 2006 11:26

ah non jai pas regardé... mais d'apres ce quon ma dit et si on veux quelque chose de particulier (regle de nommage) il faut le faire à la mimine... ;)

ChezThierry
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 273
Inscription: 21 Oct 2005

Message le Jeu Fév 09, 2006 12:45

Pour que tu comprennes mieux la raison pour changer l'ordre des règles, voici ce qui se passe avec les deux règles suivantes (et plus généralement l'utilisation de .*) :

Code: Tout sélectionner
RewriteRule (.*)*-p(.+)\.html$
$1/product_info.php?products_id=$2 [L]

RewriteRule ^(.*)-c([^-]+)-p([^-]+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]


Lorsque tu vas traiter une URL du type -http://www.example.com/produit-c12-p3.html

Cette url, tu veux la traiter avec la 2nde règle, mais en passant sur la règle 1, mod_rewrite va se satisfaire de la découpe suivante :
- produit-c12 qui est matché par (.*)*
- le signe - qui permet à mod_rewrite de repérer les deux éléments de ta règle
- p3 qui va matcher le p(.+)

Tu vas donc rediriger sur
-http://www.example.com/produit-c12/product_info.php?products_id=3
au lieu de
-http://www.example.com/produit/product_info.php?cPath=12&products_id=3


Il faut donc, soit changer l'ordre des règles, soit virer ce (.*)- au profit d'un ([^-]+)- (sauf si tes noms de produit peuvent contenir des tirets, effectivement, cette deuxième solution ne fonctionnera pas dans ce cas).

Dans le même ordre d'idée, regarde tes deux dernières règles :
Code: Tout sélectionner
RewriteRule (.*)*-m(.+)\.html$ $1/index.php?manufacturers_id=$2 [L]

RewriteRule (.*)designer-.*-d(.+)\.html$
$1/designers_info.php?designers_id=$2 [L]


D'après toi, laquelle va être prise en compte avec l'url suivante :
-http://www.example.com/produitdesigner-marcel-jeanjean-d3.html


Réponse : et bien ça sera la 1ere règle, et on sera redirigé sur :
-http://www.example.com/produitdesigner/index.php?manufacturers_id=arcel-jeanjean-d3

Faire donc TRES attention à l'utilisation des caractères trop génériques, comme le '.' (il faut souvent mieux mettre une selection de caractères possibles, a-là [-a-z0-9]) et très attention aussi à l'utilisation de l'étoile. Il vaut souvent mieux utiliser le signe '+' car on ne fait pas attention que quelquechose* ça peut matcher une chaine vide. pour tes identifiants, s'ils sont purement numérique, pense à indiquer \d+ au lieu de .+ (ça évitera qu'il match des chaines de caractères comme dans l'exemple précédent,).

Dernier point : (.*)* ne sert à rien, (.*) suffit largement (en fait je ne vois pas ce que la deuxième étoile pourrait apporter à la règle.

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Fév 09, 2006 14:10

Merci pour cette explication thierry !

Du coup je vais essayer de réécrire mes regles dans le sens que tu m'indique, et j'aimerais avoir ton avis pour savoir si je n'ai pas fait d'erreures :

Si je suis ce que tu me preconises voila comment je dois renommer ces regles (et jai aussi changer l'ordre...) :

Code: Tout sélectionner
RewriteRule ^(.*)-c(.+)-s(.+)-p(.+)\.html$
$1/index.php?cPath=$2&sort=$3&page=$4 [L]

RewriteRule ^([^-]+)-c([^-]+)-p([^-]+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]

RewriteRule ^(.*)-p(.+)\.html$
$1/product_info.php?products_id=$2 [L]


Les deux dernieres :

Code: Tout sélectionner
RewriteRule ^(.*)-m(.+)\.html$
$1/index.php?manufacturers_id=$2 [L]

RewriteRule ^(.*)designer-([-a-z0-9])*-d(.+)\.html$
$1/designers_info.php?designers_id=$2 [L]


Avec ces modifications, j'aurais bien quelque chose du type :
tabouret-p225.html
ou
tabouret-de-bar-c36_52-p281.html
ou encore :
tabouret-de-bar-c36_52-s2a-p281.html
et :
phillipe-starck-m36.html

Sans passer par des sous dossier ? en gros est ce que la jai des regles qui sont viables ?

ChezThierry
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 273
Inscription: 21 Oct 2005

Message le Jeu Fév 09, 2006 16:33

Elles me paraissent viables, mais évite le .+ là ou tu n'attends que des chiffres. Utilise simplement \d+ comme ça tu t'évites des surprises, avec les regexp faut jamais être trop large sinon y'a toujours une anguille qui surgit quand t'as pas les 20mn nécessaires à corriger le problème.

Donc tes c(.+) s(.+) m(.+) etc, faudrait les remplacer par des c(\d+) m(\d+) etc., ou si comme dans ton exemple (s2a) tu as des caractères aussi, mets au moins même chose que plus bas : c([^-]+) , m([^-]+) , etc.

Et je comprends pas pourquoi la 2eme règle utilise ([^-]+) là ou les autres règles utilisent (.*), faudrait mettre, aux trois : (.+)

Sinon, ça m'a l'air correct, j'espère ne pas avoir laissé passer une erreur, mais si tu as un pb WRI est là pour aider :)
Dernière édition par ChezThierry le Jeu Fév 09, 2006 16:54, édité 1 fois.

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Fév 09, 2006 16:48

oki oki, alors je repasse mes regles :

Code: Tout sélectionner
RewriteRule ^(.*)-c(\d+)-s([^-]+)-p(\d+)\.html$
$1/index.php?cPath=$2&sort=$3&page=$4 [L]

RewriteRule ^([^-]+)-c(\d+)-p(\d+)\.html$
$1/product_info.php?cPath=$2&products_id=$3 [L]

RewriteRule ^(.*)-p(\d+)\.html$
$1/product_info.php?products_id=$2 [L]

RewriteRule ^(.*)-m(\d+)\.html$
$1/index.php?manufacturers_id=$2 [L]

RewriteRule ^(.*)designer-([-a-z0-9])*-d(\d+)\.html$
$1/designers_info.php?designers_id=$2 [L]


Et je comprends pas pourquoi la 3eme règle utilise ([^-]+) là ou les autres règles utilisent (.*), faudrait mettre, aux trois : (.+)

>> la jai pas compris de laquelle de mes regles tu parlais... ?

Sinon les modifs par rapport a ce que tu mas dit c bon la ? et l'ordre te parait bien ? Je te demande tout ca car je ne pourrais faire le test que ce soir :(

En tout cas merci beaucoup pr toutes tes reponses, ca m'aide bien a comprendre le truc...

ChezThierry
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 273
Inscription: 21 Oct 2005

Message le Jeu Fév 09, 2006 17:00

OUi, je viens de corriger, je parlais de la 2eme, tu commences avec ([^-])+ donc tu ne peux pas avoir de répertoire avec un '-' pour celle-là alors que tu peux pour les 2 autres.

Pour le reste, ça m'a l'air bien, sauf la dernière : ton $2 correspondant maintenant au contenu de la parenthèse que tu as ajoutée (le ([-a-z0-9])).

De manière générale, lorsque tu places une étoile après une parenthèse fermante, tu peux te dire que tu fais une erreur :) y'a rarement besoin de faire ça. Dans le cas qui nous concerne, par exemple, tu devrais plutot l'écrire comme ça :
Code: Tout sélectionner
RewriteRule ^(.*)designer-[-a-z0-9]+-d(\d+)\.html$
$1/designers_info.php?designers_id=$2 [L]


(mais attention à ne jamais indiquer de nom de designer qui contienne un autre caractère (accents perdus, apostrophe, arobase, etc.)

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Fév 09, 2006 17:30

Ah super, alors en fait ya juste ma derniere regle qui posait probleme dans ce cas la...

Par contre lorsque tu dis :
donc tu ne peux pas avoir de répertoire avec un '-'


>> tu as bien compris que je ne voulais pas de repertoire avant ? je veux juste la page avec lextension .HTML... parceque du coup je me demande si les regles que tu m as corrigé comprenne un repertoire ou pas ?...

ChezThierry
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 273
Inscription: 21 Oct 2005

Message le Jeu Fév 09, 2006 23:43

Oui, j'ai bien compris, mais le $1 devient bien un répertoire APRES la ré-écriture, c'est de ça dont je parlais :)

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Ven Fév 10, 2006 9:31

Ah merdasse !! :roll:

du coup ca ne peut pas être simplement tabouret-de-bar-c22-p255.html mais forcement repertoire/tabouret-de-bar-c22-p255.html ...

Ca explique pourquoi rien ne fonctionne ché moi malgré le nouveau fichier HTACCESS.

Je vais encore abuser de ton aide precieuse mais il faut absolument que je reussisse à renommer ces pages produits...

Ci-dessous, je repars sur mon fichier de base ou le renommage des catégorie fonctionnait (tu as le resultat souhaité juste au dessus de chaque regle):

Code: Tout sélectionner
luminaire-c22.html ou sous catégorie tabouret-de-bar-c36_51.html
RewriteRule (.*)*-c(.+)\.html$ $1/index.php?cPath=$2 [L]

tabouret-p225.html
RewriteRule (.*)*-p(.+)\.html$ $1/product_info.php?products_id=$2 [L]

tabouret-de-bar-c36_52-p281.html
RewriteRule (.*)*-c(.+)-p(.+)\.html$ $1/product_info.php?cPath=$2&products_id=$3 [L]

tabouret-de-bar-c36_52-s2a-p281.html
RewriteRule (.*)*-c(.+)-s(.+)-p(.+)\.html$ $1/index.php?cPath=$2&sort=$3&page=$4 [L]

phillipe-starck-m36.html
RewriteRule (.*)*-m(.+)\.html$ $1/index.php?manufacturers_id=$2 [L]

designer-buclon-pascal-d67.html
RewriteRule (.*)designer-.*-d(.+)\.html$ $1/designers_info.php?designers_id=$2 [L]


Bon je sais ya plein de trucs qui te paraissent incohérent du coup, vu toutes les modifs quon a faite avant, mais la du coup on peut repartir sur ça pour essayer de zapper ces "repertoire virtuelles" puisque je fais le lien uniquement vers une page HTML.

Du coup le $1 je le zap et le place à la palce du $2 ? Si tu pouvais m'aider pour réécrire correctement une des regles ci-dessus, je me baserais sur elle pour faire les autres...

Merci encore pour ton temps !


Voila ce qu'à fait le developpeur pour le rewriting (explication qui peuvent nous aider pour les regles) :

Code: Tout sélectionner
pour t'aider dans la réalisation de tes regles j'ai mis un système en ligne qui
te permet d'afficher le lien pour chaque appel de la fonction tep_href_link(),
ainsi tu pourra visualiser les urls différentes pour tous les liens de la page.
ca va déformer la mise en page, mais ne t'inquite pas il y as que toi qui le
verra

Pour cela c'est très simple : tu ouvre la page que tu souhaite voir, ensuite tu
rajoute à la fin de l'url la variable suivante :
&testsb=1 comme ceci :
index.php?cPath=36&testsb=1
index.php?cPath=36_49&testsb=1
product_info.php?cPath=36_49&products_id=394&testsb=1
cela va généré une ligne comme cela :

<-- url Test -->
index.php?cPath=36
<-- Fin de url test -->

chaque fois que la fonction tep_href_link() est appelé
ainsi tu pourra voir quel sont les urls appelées, leurs syntaxe et ou elles sont
appelées.

sinon tu trouvera ci-dessous les regex que j'ai utilisé pour réécrire les urls
peut être cela va t'aider pour les reconstituées

POUR LA PAGE : index.php

$n = ereg('[&\?/-]?cPath[=/]([0-9_]+)', $parameters, $r);
$s =
ereg('[&\?/-]?cPath[=/]([0-9_]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)[&\?/-]?page[=/]([0-9]+)',
$parameters, $t);
$k =
ereg('[&\?/-]?cPath[=/]([0-9_]+)[&\?/-]?page[=/]([0-9]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)',
$parameters, $l);
$e =
ereg('[&\?/-]?manufacturers_id[=/]([0-9_]+)[&\?/-]?page[=/]([0-9]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)',
$parameters, $f);
$g =
ereg('[&\?/-]?manufacturers_id[=/]([0-9_]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)[&\?/-]?page[=/]([0-9]+)',
$parameters, $h);
$y =
ereg('[&\?/-]?designers_id[=/]([0-9_]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)[&\?/-]?page[=/]([0-9]+)',
$parameters, $x);
$w =
ereg('[&\?/-]?designers_id[=/]([0-9_]+)[&\?/-]?page[=/]([0-9]+)[&\?/-]?sort[=/]([0-9a-zA-Z]+)',
$parameters, $v);

POUR LA PAGE : product_info.php

elseif($page == 'product_info.php') {             
   $l = ereg('[&\?/]?products_id[=/]([0-9]+)', $parameters, $m);
   $n = ereg('[&\?/]?cPath[=/]([0-9_]+)', $parameters, $r);                         
   $select_prd = $m[1];
   $select_cat = $r[1];
   $the_product_info_query = tep_db_query("select pd.language_id, p.products_id,
pd.products_name, p.products_model from " . TABLE_PRODUCTS . " p, " .
TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . $select_prd . "'
and pd.products_id = '" . $select_prd . "'" . " and pd.language_id ='1'");
   $the_product_info = tep_db_fetch_array($the_product_info_query);
   $the_product_info['products_name'] =
strtr($the_product_info['products_name'],$tofind,$replac);
   $the_product_info['products_name'] =
strtolower($the_product_info['products_name']);
   $the_product_info['products_name'] = ereg_replace("[^a-zA-Z0-9]", "-",
$the_product_info['products_name']);         
   $parameters =
ereg_replace("[&\?/]?cPath[=/]([0-9_]+)[&\?/]?products_id[=/][0-9]+[&/]?", "",
$parameters);
   while (strstr($the_product_info['products_name'], '--'))
$the_product_info['products_name'] = str_replace('--', '-',
$the_product_info['products_name']);
   $the_product_info['products_name'] = ereg_replace("-$", "",
$the_product_info['products_name']);
   if ($n && $l) {
   $off =1;
    $page = str_replace('product_info.php', $the_product_info['products_name'].
'-c'. $select_cat  . '-p' . $select_prd, $page);
   }
   else {
   $off =0;
   }
   if ($l && $off == 0) {
    $page = str_replace('product_info.php', $the_product_info['products_name'] .
'-p' . $select_prd, $page);
   }
    $link = $page . '.html';
  }
Dernière édition par rigolman le Dim Fév 12, 2006 22:29, édité 1 fois.

ChezThierry
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 273
Inscription: 21 Oct 2005

Message le Ven Fév 10, 2006 12:40

J'ai pas beaucoup de temps avant ce soir, mais en attendant je me permet tout me même de m'interroger :

le coup du répertoire avant le index.php, c'est toi qui te l'impose, c'est pas obligatoire.
Mais comme depuis le début tu prends dans tes exemples le $1 (luminaire, tabouret-de-bar, etc.) pour en faire un répertoire je pensais que c'était ce que tu voulais faire.

Ce n'est pas obligatoire. Pour autant, le $1 tu n'en as pas besoin (faut alors juste virer les trois caractères '$1/' de la règle d'arrivée).

Tu n'es pas OBLIGE d'avoir des répertoires, c'est juste que depuis le début tu présentes tes exemples comme s'il devait y en avoir, qui portent le nom des catégories :)

Conflits entre deux regles - votre avis

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

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 :



Qui est en ligne

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