Mes débuts dans l'URL Rewriting

Nouveau WRInaute
Bonjour, je viens vers vous (pour ma toute première fois sur un forum) car après avoir parcouru beaucoup de forums et avoir appliqué un tas de choses dans mon fichier .htaccess je n'arrive toujours pas à faire fonctionner l'url rewriting des pages de mon site.

Mon site a une structure très simple.
En gros il se résume à 2 types d'adresse URL.

La pagination et les articles.

Type d'adresse pour la pagination : http://www.exemple.ovh/?numeroPagePanne=1
Dans ce cas, seul le dernier chiffre change en fonction de la page consultée.

Type d'adresse pour les articles : http://www.exemple.ovh/?clefPanne=2529
Dans ce cas, seuls les derniers chiffres changent en fonction de l'article consulté.

Après avoir vu l'article https://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting

La page "test" http://www.exemple.ovh/inconnu.html fonctionne.
Le service URL rewriting est bien activé sur mon server Apach 2 sous debyan.

J'ai donc essayé le code suivant :
# Test URL Rewriting
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^inconnu.html$ /test/test.html [L]

# Réécriture des URL de pagination
RewriteRule ^Page-([0-9]+)).html$ /?numeroPagePanne=$1 [L]
# URL prise en exemple http://www.exemple.ovh/?numeroPagePanne=1

# Réécriture des URL des fiches de panne
RewriteRule ^Panne-([0-9]+)).html$ /?clefPanne=$1 [L]
# URL prise en exemple http://www.exemple.ovh/?clefPanne=2529

Mais cela ne fonctionne pas.

Quelqu'un pourrait il m'aider ?

Merci par avance
 
WRInaute accro
Faux :
RewriteRule ^Page-([0-9]+)).html$ /?numeroPagePanne=$1 [L]

Correct :
RewriteRule ^Page-([0-9]+)\.html$ /?numeroPagePanne=$1 [L]
 
Nouveau WRInaute
Bonjour et merci, donc, je viens d'essayer ce code :

# Réécriture des URL de fiche de panne
RewriteRule ^Page-([0-9]+)\.html$ /?numeroPagePanne=$1 [L]
# URL prise en exemple http://www.exemble.ovh/?numeroPagePanne=1

# Réécriture des URL de fiche de panne
RewriteRule ^Panne-([0-9]+)\.html$ /?clefPanne=$1 [L]
# URL prise en exemple http://www.exemple.ovh/?clefPanne=2529

Sous cette forme, les pages affichées ne sont plus en erreur, le contenu affiché est intact.
Mais l'URL n'est pas réécrite.

Y aurait il autre chose à faire ?

Merci beaucoup ;-)
 
WRInaute accro
Sous cette forme, les pages affichées ne sont plus en erreur, le contenu affiché est intact.
Mais l'URL n'est pas réécrite.

Je ne comprend pas bien ce que tu cherches à faire ou à nous dire.
Tout à l'heure tu disais que "cela ne fonctionne pas" et maintenant tu dis "les pages affichées ne sont plus en erreur". Alors est-ce que ça ne fonctionnait pas ou est-ce qu'il y avait une erreur (genre erreur 500) ? Tu n'avais jamais parlé d'une quelconque erreur avant.

Quand tu dis "le contenu affiché est intact" tu parles du contenu affiché sur la ligne d'adresse ou dans la page ?

Quand tu dis "l'URL n'est pas réécrite" tu attends quoi par réécriture ?

Le principe c'est d'appeler une page de type http://example.com/Page-123.html et d'appeler le script php http://example.com/index.php?numeroPagePanne=123

Ce qui s'affiche a l'écran doit correspondre au contenu qui correspond à l'id 123 et l'url qui est affichée dans la barre d'adresse ne doit surtout pas être réécrite mais doit être http://example.com/Page-123.html et personne ne doit savoir que la page qui est exécutée sur le serveur est index.php

Au passage je te déconseille d'utiliser des majuscules dans les URL car Apache tourne sous Unix et il est sensible à la casse.
 
Nouveau WRInaute
Merci pour votre réponse.
Et excusez moi pour cette description qui n'est visiblement pas très claire.

En fait, lors de ma première question, avec l'erreur de syntaxe dans la formule.

RewriteRule ^Page-([0-9]+)).html$ /?numeroPagePanne=$1 [L]
Le contenu de ma page (contenu visible sur le net) ne s'affichait pas. La page était en erreur.

Mais avec la correction que vous m'avez fait apporter à la formule " \ "la page s'affiche correctement mais l'URL ne change pas.

Je m'attendais à voir :
RewriteRule ^Page-([0-9]+)).html$ /?numeroPagePanne=$1 [L]
# URL prise en exemple http://www.exemple.ovh/?numeroPagePanne=1

http://www.exemple.ovh/Page=1

RewriteRule ^Panne-([0-9]+)).html$ /?clefPanne=$1 [L]
# URL prise en exemple http://www.exemple.ovh/?clefPanne=2529

http://www.exemple.ovh/Panne=2529

Le but final étant d'utiliser la balise "Title" de la page =2529 à la place du mot "Panne".
Comme par exemple
http://www.exemple.ovh/Contenu de la balise title=2529

Cela est il possible ?
Merci encore.
 
Dernière édition:
WRInaute accro

Ok. Je pense que tu n'as pas bien saisi comment fonctionne l'url rewriting, à quoi ça sert, et encore moins ce que tu as codé.

Ce qui me fait dire ça c'est le commentaire # URL prise en exemple et encore pire, ce que tu as ajouté en dessous qui est censé correspondre à ce que tu as codé dans la règle de réécriture mais qui pourtant ne correspond pas du tout à ce qu'il y a de codé

Tu écris maintenant : Page=1
alors que dans la règle il y a : ^Page-([0-9]+)\.html$
^
signifie : débute par
$ signifie : se termine par
On trouve bien le mot : Page
mais ensuite il doit y avoir un tiret
[0-9]
signifie : n'importe quel caractère compris entre 0 et 9
+ signifie : l'expression précédente est répétée (donc n'importe quel caractère compris entre 0 et 9 pouvant se répéter de 1 à n fois)
\. signifie : présence d'un point (on est obligé de mettre un \ pour l'échapper, c'est une question de syntaxe)
html signifie : html
les parenthèses représentent ce que tu vas retrouver plus loin en tant que $1. Tu as une parenthèse ouvrante et une parenthèse fermante (dans ta première version il y avait deux parenthèses fermantes, donc en relisant simplement ce que tu avais écris tu aurais du t'en rendre compte rapidement)

donc ^Page-([0-9]+)\.html$ correspond à la traduction de quelque chose qui est par exemple : http://www.exemple.ovh/Page-1.html

Maintenant tu parles de : Page=1
On ne comprend pas d'où ça sort

Page=1 ça s'écrirait comme ceci :
^Page=([0-9]+)$

Le principe de l'url rewriting c'est d'utiliser des url fictives qui n'existent pas réellement sur le serveur pour les rediriger vers une url unique qui existe sur le serveur et de communiquer des paramètres à cette url

Quand tu écris : # URL prise en exemple http://www.exemple.ovh/?numeroPagePanne=1
c'est en fait l'adresse de l'url de destination, celle qui existe sur le serveur. Tu dois avoir une page php, qui de toute évidence est index.php puisque tu ne donnes pas le nom de cette page
? indique que la suite ce sont des paramètres
numeroPagePanne est le nom de l'un de ces paramètres (un nom à la con au passage)
= est le signe égal
1 est la valeur du paramètre numeroPagePanne

En fait, la première règle signifie que quand l'internaute tape l'adresse : http://www.exemple.ovh/Page-1.html ça le redirige au niveau du serveur à l'adresse http://www.exemple.ovh/?numeroPagePanne=1
Mais l'adresse qui reste affichée dans la barre d'adresse du navigateur est http://www.exemple.ovh/Page-1.html et c'est cette url qui sera référencée dans google. C'est cette url qui doit être utilisée dans les liens que tu peux faire à l'intérieur du site. C'est la seule url qui est visible de l'extérieur.

Où ça se complique c'est quand tu code la seconde règle :

RewriteRule ^Panne-([0-9]+)).html$ /?clefPanne=$1 [L]

Ca signifie qu'avec une autre forme d'url, (Panne-2529.html) tu exécute le script serveur qui est le même que pour la première règle, mais en lui communiquant un paramètre différent.
Le paramètre qui est valorisé cette fois est clefPanne

Tu ne trouves pas que c'est un peu compliqué d'avoir un seul script qui gère deux types de paramètres différents ? Et ce qui n'est pas très logique c'est que les deux paramètres ne sont pas valorisés systématiquement.

Le plus simple serait d'avoir deux scripts php qui traitent chacun une des fonctionnalité.

Si ce script est déjà écrit et traite bien les deux fonctionnalité je trouverai plus logique de l'appeler en lui communiquant les valeurs de tous les paramètres (à zéro s'ils ne sont pas valorisés)

Ca donnerait des règles comme ceci :
RewriteRule ^Page-([0-9]+)).html$ /?numeroPagePanne=$1&clefPanne=0 [L]
RewriteRule ^Panne-([0-9]+)).html$ /?numeroPagePanne=0&clefPanne=$1 [L]

Le but final étant d'utiliser la balise "Title" de la page =2529 à la place du mot "Panne".
Comme par exemple
http://www.exemple.ovh/Contenu de la balise title=2529

Oui, c'est tout à fait possible mais en ce qui concerne la balise Title ça va te compliquer la vie car elle peut faire jusqu'à 80 caractères et elle-même contenir des chiffres. Et tu peux être amené à changer le title de ta page, ce qui va du même coup changer l'url de la page et créer des gros problèmes car il faudra alors changer tous les liens qui mènent vers cette page et pour les liens externes ça va créer des erreurs 404

Il faudrait en plus que tu utilises un indice qui te permette de savoir où se trouve le numéro. Exemple : -id2529
Tu pourrais alors avoir une url qui s'écrit :
http://www.exemple.ovh/blabla du titre-id2529.html

%20 représente les espaces (un autre soucis à régler)

Et quand tu auras des caractères spéciaux dans le title ça va être une autre source d'emmerdes.

Mais comme ta page est enregistrée dans une base de données tu peux très bien ajouter un champ à cette base de donnée qui va contenir l'url propre, du moins celle qui précède le -id2529

Ensuite dans ton script il faut bien vérifier que l'url qui a été saisi corresponde exactement à celle qui est prévue car sinon c'est le risque de doublons d'url avec même contenu car la règle affichera les mêmes contenus pour les urls suivantes :
blabla-id2529.html
blibli-id2529.html
tototiti-id2529.html

Tu noteras bien que je met toujours .html à la fin des urls car c'est ce que tu as codé dans ta règle :
\.html$
Tu veux que ça se termine par .html
Alors je ne comprend pas pourquoi tu te mets à parler de =2529 puisque dans la règle que tu as codé tu veux que ce soit un -, un nombre, un point, et se terminant par html
Si tu n'es pas clair dans ta tête avec tes propres choix l'url rewriting n'est pas prêt de fonctionner car il fait bêtement et méchamment ce qui est demandé et ne cherche pas à interprêter. Ce n'est pas une IA.
 
Nouveau WRInaute
Merci beaucoup, c'est vraiment très sympa d'avoir pris le temps de m'expliquer tout cela.

Ce que je veux (dans ma tête) est clair.
C'est que, jusqu'ici je ne comprenais pas très bien la syntaxe du Rewriting.

Merci encore, je vais bricoler avec tout ça.
 
Nouveau WRInaute
Merci indigene pour ton post expliquant le fonctionnement du rewriting url, j'avais mal compris comment l'utiliser malgré la lecture de plusieurs tutos.
Ta réponse m'a été salutaire, par contre le ton employé est déplacé ... on a tous été débutant un jour.
 
WRInaute accro
Tu dis ça parce que tu ne me connais pas. J'utilise toujours ce ton. Et ce n'est pas une question de débutant ou non. Où vois-tu de la moquerie dans ce que j'ai écris parce que l'intervenant était débutant (ou pas) ? Si on accuse quelqu'un de quelque chose il faut en apporter la preuve. Je ne pense pas avoir fait état d'un possible débutantisme à aucun moment et j'ai encore moins utilisé un ton déplacé.
D'ailleurs sur un forum le principe est de débattre et que chacun apporte ses idées et sa propre vision des choses. Venir écrire un message juste pour contredire un autre intervenant en le citant ce n'est pas très fair-play et ce n'est pas l'essence d'un forum. On peut parfaitement avoir des points de vue différents et dans ce cas on expose ses propres points de vue. Mais on le fait en respectant les points de vue des autres et sans les critiquer.
Pour un premier message, venir critiquer directement la façon de s'exprimer de quelqu'un d'autre, c'est un peu moyen.
Désolé de réagir de la sorte mais quand on me rentre dedans je dégaine direct.
 
Nouveau WRInaute
Je me suis inscris pour te remercier de base car je bloquais depuis hier soir avec des tutos qui ne me faisaient que m'embrouiller un peu plus après chaque lecture.

Te dire que ta manière de répondre est déplacé n'est que le ressenti de ma lecture, nullement une critique ou une agression mais un simple constat.
Bref fin de la parenthèse en ce qui me concerne, j'ai du travail qui m'attend.

Bonne journée et merci encore, grâce à tes lumières ça marche niquel.
 
WRInaute accro
NB: le rewriting comme ça n'est qu'une rustine, en général on utilise un point d'entrée commun (AKA dispatcher) et c'est le framework qui s'occupe du reste.
 
WRInaute occasionnel
moi je vois qu'une solution : "service URL rewriting est bien activé sur mon server Apach 2 sous debyan."
passer sous une autre distribution de Linux
 
Discussions similaires
Haut