8768 sujets

Développement web côté serveur, CMS

Bonjour
j'utilise depuis longtemps l'url rewriting pour mes sites, mais je ne suis pas expert du langage d'Apache... et finalement je m'en sers toujours de la meme façon donc ça passe... mais aujourd'hui j'ai une petite spécificité et je suis perdu. Si une bonne ame pouvait m'aider... merci !

Globalement, j'utilise toujours une page content.php?id=xx et je la masque en utilisant ce code :

RewriteEngine On
RewriteRule ^(.*)-([0-9]+).htm$ /content.php?id=$2 [L]


Ca me permet ensuite d'avoir des pages du genre cequejeveux-4.htm à la place de content.php?id=4

Aujourd'hui, j'ai déjà mon site qui fonctionne comme ça, mais j'ai dû rajouter une autre page produit.php qui me permet d'afficher le détail d'un ensemble de produits qui ont tous la meme forme...

j'ai bien conscience qu'avec ce code général, je ne vais pas pouvoir faire cohabiter à la fois la détection de content.php?id=4 et de produit.php?id=4 par exemple...
Et du coup, je ne sais pas comment faire...
j'avais pensé faire cela :


RewriteEngine On
RewriteRule ^(.produit*)-([0-9]+).htm$ /produit.php?id=$2 [L]
RewriteRule ^(.*)-([0-9]+).htm$ /content.php?id=$2 [L]


pour avoir à la fois :
produitcequejeveux-4.htm
et
cequejeveux-4.htm

mais cela ne marche pas et d'une certaine façon je comprends que ce n'est pas très logique car ma 2e condition est générale et englobe donc mon 1er cas... il me semble ?

j'ai pensé aussi faire cela :


RewriteEngine On
RewriteRule ^(.produit*)-([0-9]+).htm$ /produit.php?id=$2 [L]
RewriteRule ^(.divers*)-([0-9]+).htm$ /content.php?id=$2 [L]


et donc avoir des urls du genre :
produitcequejeveux-4.htm qui remplace produit.php?id=4
et
diverscequejeveux-4.htm qui remplace content.php?id=4
mais je ne suis pas sûr que cela fonctionne et en plus cela me gène car je vais perdre le référencement des pages existantes cequejeveux-4.htm...

Donc je ne sais plus trop comment avancer sur le sujet...

merci de votre aide, j'espere avoir été assez clair
Modifié par jp.bond (01 Mar 2017 - 19:14)
Salut,

En fait la syntaxe de tes règles est incorrecte. Les fichiers de conf d'Apache supporte les expressions régulières PCRE et il faut que tu apprennes les bases de cette construction syntaxique. Tu peux aller voir par là : https://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2

Pour ton cas il faut que tes règles soient écrites comme ceci :
RewriteEngine On
RewriteRule ^produit.*-([0-9]+)\.htm$ /produit.php?id=$1 [L]
RewriteRule ^.*-([0-9]+)\.htm$ /content.php?id=$1 [L]


Pour une url de ce type : /produitcequejeveux-4.htm :
commence (^) par "produit"
suivi de n'importe quel caractère (.) présent ou non, une fois ou plusieurs (*)
suivi d'un "-"
suivi d'au moins un caractère compris entre 0 et 9 ([0-9]+)
se termine ($) par ".htm" (\.htm) : attention le . est un caractère réservé, donc si tu veux matcher un "." il faut l'échapper (\)

Par ailleurs il faut que tu commences par les lignes les plus spécifiques pour aller vers les plus générales. Avec le drapeau [L], le script s'arrête dès qu'il rencontre une règle correspondante.

Tu peux tester tes règles là par exemple : http://htaccess.madewithlove.be/ ou tester tes regex ici : https://regex101.com/
Meilleure solution
vraiment merci !
d'abord tu as pris le temps de m'expliquer, mais aussi de m'aider à me débrouiller tout seul pour la suite... super explication, à moi de me pencher pour tout bien comprendre à présent
Et evidemment ça marche !
il y a juste un détail qui est bizarre, c'est que si j'ecris l'url :
/produitcequejeveux-4.htm je suis redirigé vers l'url produit.php?id=4
ce que je veux dire par là c'est que c'est ce qu'il est écrit en tant qu'url final... comme si l'url rewriting fonctionnait qu'à moitié, l'interprétation est bonne, mais elle fonctionne comme une redirection sans conserver la réécriture...
Bonsoir.
jp.bond a écrit :

il y a juste un détail qui est bizarre, c'est que si j'ecris l'url :
produitcequejeveux-4.htm je suis redirigé vers l'url produit.php?id=4


"Ce que je veux" est repris par .* mais uniquement pour établir la correspondance et c'est ce qui fait que la règle peut s'appliquer.
La seule chose qui soit reprise dans la réécriture de l'url est le nombre grâce à la seconde parenthèse (qui est identifiée par $2). Le reste est écrit en 'dur' : produit.php

(La seule chose que je trouve bizarre est que cela fonctionne avec le '/' devant...)

Smiley smile
Salut,
Je ne sais pas trop pourquoi tu as une redirection maintenant. Normalement, la redirection est effectuée lors de l'utilisation du drapeau [R] mais tu peux essayer de forcer l'alias avec le drapeau [PT].
RewriteEngine On
RewriteBase /
RewriteRule ^produit.*-([0-9]+)\.htm$ /produit.php?id=$1 [PT,L]

https://httpd.apache.org/docs/2.4/fr/rewrite/flags.html
Modifié par MatthieuR (07 Mar 2017 - 22:00)