Règle .htacess toute simple mais qui ne fonctionne plus ??

WRInaute passionné
Bonjour à tous,

Mon problème est très simple, mais je n'en trouve pas la solution.

J'ai 2 règles qui s'interfèrent, pourtant je ne vois pas pourquoi du tout, si un avis éclairé peut m'aider :

Code:
RewriteRule ^(.*)-p-([0-9]+).html product_info.php?products_id=$2 [L]
RewriteRule ^(.*)-pr-([0-9]+).html prints.php?prints_id=$2 [L]

La 1ère regroupe toutes les URLS avec blablablabla-p-546.html => redirection vers products_info.php?products_id=546
La 2ème regroupe toutes les URLS avec blablablabla-pr-546.html => redirection vers prints.php?prints_id=546

Rien de bien compliquer en somme ! Sauf que j'ai une série d'adresse du type brother-p-touch-1200-pr-546.html

Le problème est que cette adresse est redirigée vers le mauvais fichier à cause du -p- qu'elle contient je suppose.
Pourquoi passe-t-elle la 1ère règle alors que selon la règle de mon htacces, le -p- doit être suivi de 1 ou plusieurs chiffres, ce qui n'est pas le cas dans cette URLs puisque le -p- est suivi de "touch"

Quelqu'un peut m'aider ? Siouplait :)
 
WRInaute passionné
Ha et quand je remplace [0-9]+ par [:digit:]+ j'ai une erreur 500 ce qui n'est pas logique puisque c'est censé être la même chose non ?
 
WRInaute passionné
J'ai modifié un peu mais ça ne fonctionne tjrs pas :
Code:
RewriteRule ^(.*)-p-([^a-zA-Z][0-9]+)\.html product_info.php?products_id=$2 [L]
RewriteRule ^(.*)-pr-([^a-zA-Z][0-9]+)\.html prints.php?prints_id=$2 [L]
Là je dis bien "-p-" suivi directement de 1 ou plusieurs chiffres suivis directement de ".html" donc pas le choix !

Et pourtant l'URL brother-p-touch-1200-pr-546.html passe la 1ère règle et non la 2ème !
 
Olivier Duffez (admin)
Membre du personnel
le début des règles n'a pas d'intérêt, tu mets le signe ^de début de chaine pour dire qu'elle peut commencer par n'importe quoi
par contre tu n'as pas mis le signe pour la fin

à quoi sert ton
Code:
[^a-zA-Z]
? surtout que tu ne dis pas combien de fois il peut apparaitre
s'il n'y a que des chiffres possibles à la fin, autant l'indiquer

essaie
Code:
RewriteRule -p-([0-9]+)\.html$ product_info.php?products_id=$1 [L]
RewriteRule -pr-([0-9]+)\.html prints.php?prints_id=$1 [L]

au passage, il ne s'agit pas de redirections mais de réécriture d'URL
 
WRInaute accro
Le problème est que cette adresse est redirigée vers le mauvais fichier à cause du -p- qu'elle contient je suppose.
Moi je pense plutôt que c'est a cause du 'pr' avant les chiffres ce qui correspond parfaitement a la règle que tu donne dans le premier post.
 
WRInaute passionné
@WebRankInfo : Les règles que tu me donnes sont identiques aux miennes, à part le $ à la fin mais j'avais déjà essayé, ça ne change rien.

@zeb : Pas compris ta réponse... L'URL brother-p-touch-1200-pr-546.html contient bien un "-p-" mais il n'est pas suivit d'un nombre comme l'indique [0-9]+ et donc ne devrait pas passer la 1ère règle. Or elle passe la 1ère règle puisqu'elle renvoie vers le fichier product_info.php (-p-) au lieu de prints.php (-pr-)

Je ne comprends vraiment pas help :'(
 
WRInaute passionné
Tu n'as qu'a inverser l'ordre, comme ca il fera la premiere regle avec le pr et c'est reglé, il ne testera pas la deuxieme regle avec p..

Voila pour une solution rapide, apres les details du pourquoi du comment, disons que c'est pour les passionés, si t'es pressé fais ca, met la regle du pr avant celle du p et passe à autre chose :-)
 
Olivier Duffez (admin)
Membre du personnel
lambi521 a dit:
@WebRankInfo : Les règles que tu me donnes sont identiques aux miennes, à part le $ à la fin mais j'avais déjà essayé, ça ne change rien.
il n'y a pas que ça comme différences... bref je pensais que ça irait
 
WRInaute passionné
@FortTrafic : Je me suis dit exactement la même chose, en inversant l'ordre des 2 règles il exécutera la bonne et bien en fait non ! Ca fait le même effet !

@WRI : Oui exact l'idée pour le début de la chaine aurait pu être bonne mais j'ai testé et ça produit le même effet :(

C'est hallucinant quand même, puisque avec ces 2 règles simples qui ne laissent pas le choix, c'est forcément l'un ou l'autre, comment se fait-t-il que le serveur se plante ? je dit bien "-p-" ou "-pr-" suivi de 1 ou plusieurs chiffres suivis de .html ! Ou alors y'a un truc que je pige pas...
 
WRInaute accro
Chaque règle de réécriture s'applique au résultat de la règle précédente, selon l'ordre dans lequel elles ont été définies dans le fichier de configuration. Le chemin de l'URL ou du système de fichier (voir ci-dessus Qu'est-ce qui est comparé ?) est intégralement remplacée par la chaîne de Substitution et le processus de réécriture se poursuit jusqu'à ce que toutes les règles aient été appliquées, ou qu'il soit explicitement stoppé par un drapeau L, ou par un autre drapeau qui implique un arrêt immédiat, comme END ou F.
voir ici

Je pense que tu devrais appliquer une condition en amont de ta règle de réécriture car tu dois avoir des règles qui perturbent ce type d'url en amont.

RewriteCond Directive
 
WRInaute passionné
Oui je pense que vous avez raison, je vais tout rassembler/mixer/tester parce que là j'ai simplifier au max et je trouve encore des cas particuliers comme celui-ci qui perturbent un peu le fonctionnement sans qu'on puisse vraiment le savoir ! Car dans le cas que je cite ici, le fichier PHP faisait lui aussi un redirection 301 vers la page d'accueil donc pas de 404 donc aucun moyen de le savoir ! Je suis tombé dessus donc je m'en suis rendu compte mais sinon je ne l'aurai jamais vu..

C'est bien le rewriting mais faut vraiment bien le gérer sinon ça peut vite être catastrophique... Et encore je n'ai que 4 grandes règles de rewriting, je ne sais pas comment font les sites avec des centaines de "rubriques" !

Merci pour votre aide je vais creusé tout ça ;)
 
WRInaute accro
lambi521 a dit:
je ne sais pas comment font les sites avec des centaines de "rubriques" !
C'est mon cas sur un site et j'ai mis en place 3 règles (pour des raisons de simplicité mais j'aurais pu n'en mettre qu'une).
Le htaccess renvoie systématiquement toutes les urls qui ne sont pas dans les dossiers système du CMS vers trois scripts frontaux qui sont chargés de gérer :
* les pages (.php$)
* les dossiers (/$)
* les flus (.xml$)
les frontaux gèrent ensuite la requête avec des moyens php classiques ce qui me permet d'intervenir finement et facilement sans me faire .... .
 
Discussions similaires
Haut