Problème avec ma RewriteRule

Nouveau WRInaute
Bonjour,

je tente de me mettre à l'url rewriting, mais je rencontre un problème. Je travaille pour le moment en local.

Après lecture du tutorial WebRankInfo, voilà ma rewriteRule :

Code:
RewriteRule ^()([a-z]+)\.html$ index.php?page_id=$1&page_title=$2 [L]

Mes URL sont de la forme
Code:
index.php?page_id=1&page_title=Accueil
et je souhaiterais les transformer en Accueil.html, c'est à dire seulement avec la variable $page_title.

Hélas, voilà ce que j'obtiens lorsque je tente d'afficher Accueil.html :

Not Found

The requested URL Accueil.html was not found on this server.

Où est l'erreur ?

Merci d'avance
 
WRInaute impliqué
Deux questions:

1. Comment on trouve l'ID a partir de l'adresse en html? Comment on sait que accueil.html est l'ID 1?

2. Dans ta règle tu a
Code:
()
. Pourquoi?

Pour savopri ce qui se passe, remplace le [L] par [R=301]. Tu sauras en quoi est réécrit accueil.html, et donc tu trouvera pourquoi ça ne marche pas.
 
Nouveau WRInaute
1. Bien normalement, il n'y pas besoin d'afficher l'id de la page dans l'url "rewritée". Car si j'ai bien compris, l'url rewriting, c'est juste un système qui applique une url statique par dessus une url dynamique, mais le navigateur sait qu'il s'agit de index.php?page_id=1&page_title=Accueil, lorsque il affiche Accueil.html. Ou alors je n'ai pas tout compris.

2. la première parenthèse vide est justement pour l'id de la page, que je ne souhaite pas afficher dans l'url "rewritée". Cette parenthèse est vide pour que le $1 de la RewriteRule n'affiche rien pour l'id de la page.

J'ai changée le [L] par [R=301], et il ne s'est rien passé de différent. Aucun message d'erreur.
 
WRInaute impliqué
l'URL rewriting sert a transformer des urls, c'est tout, et rien de plus.

avec un R=301, quelle est l'adresse qui s'affiche dans la barre d'adresse de ton navigateur?

Mais ta règles est mal formée avec ta parenthese vide. Si l'id n'a pas besoin d'etre renseigné il faut que tu mette:

Code:
RewriteRule ^([a-z]+)\.html$ index.php?page_title=$1 [L]
 
Nouveau WRInaute
Sauf que j'ai tout de même besoin de la variable $_GET['page_id'], puisque c'est grâce à elle que je vais chercher le contenu de mes pages dynamiques. Donc mon URL ne peut pas ressembler à index.php?page_title=Accueil, mais doit bien être de la forme index.php?page_id=1&page_title=Accueil

Pour le moment, avec un R=301, si je demande d'afficher http://127.0.0.1/Projects/[...]/site/Accueil.html, rien ne se passe.

Si je demande d'afficher http://127.0.0.1/Projects/[...]/site/accueil.html (nom de page sans majuscule initiales), il transforme l'url en
http://127.0.0.1/D:/Program%20Files/EasyPHP%202.0b1/www/Projects/[...]/site/index.php?page_id=accueil&page_title=
 
WRInaute impliqué
Il faut donc que tu aie une correspondance entre le nom de la page et son id. Ta première règle ne renseignait même pas l'id soit dit en passant.

Soit tu fais une règle par page, soit tu as cette correspondance dans une base de donnée, et tu dois faire la correspondance en PHP. Cherche sur le forum, ça a été discuté il y a quelques jours.

Une règle par page donne quelque chose comme suit:

Code:
RewriteRule accueil\.html index.php?page_id=1&page_title=Accueil
RewriteRule page1\.html index.php?page_id=2&page_title=Titre1

etc. Evidemment ce n'est jouable que si le nombre de pages reste faible.
 
WRInaute accro
je suis pas d'accord avec Vap.. sry

C'est trés simple a faire ce que tu veux.. mais ne me demande pas pourquoi, il faut ajouter le NS à la fin.

Code:
RewriteRule ^(.*)\.html  /page.php?page_id=$2&page_title=$1 [NS,L]
 
WRInaute impliqué
KOogar a dit:
je suis pas d'accord avec Vap.. sry

C'est trés simple a faire ce que tu veux.. mais ne me demande pas pourquoi, il faut ajouter le NS à la fin.

Code:
RewriteRule ^(.*)\.html  /page.php?page_id=$2&page_title=$1 [NS,L]

Pas besoin d'être désolé. NS sert a éviter certaines erreurs. Mais je ne vois pas quelle sera la valeur de page_id avec ta règle. Peux tu m'expliquer?

Edit: j'ai testé, et c'est bien ce que je pensais, page_id n'est pas renseigné.
 
WRInaute accro
je pense que c'est un probleme au niveua de la boucle globale, c'st pk sans le NS cela renvois sur la page php

ca etant je te laisse apprecier :
--http://www.urlrewriting.fr/testpriv/met-ce-que-tu-veux-ici.html
 
WRInaute impliqué
KOogar a dit:
je pense que c'est un probleme au niveua de la boucle globale, c'st pk sans le NS cela renvois sur la page php

ca etant je te laisse apprecier :
--http://www.urlrewriting.fr/testpriv/met-ce-que-tu-veux-ici.html

Ca fait quoi ton test?

Le test que j'ai fait est de rentrer la règle que tu as donné et d'imprimer page_id et page_title. Seul page_title ($1) est imprimé, et page_id n'est pas défini.
 
WRInaute impliqué
Je ne joue pas, j'essaie d'aider. Je pense avoir aidé suffisamment de gens avec leurs problèmes de réécriture pour avoir le droit qu'on ne pense pas que je joue. Il suffit de lire ce forum pour le voir.

Bref, aucune des règles proposées ne permet de donner une valeur a page_id. C'est simple à vérifier, et j'ai proposé une solution.

Pas besoin de s'enerver pour ça ni de me dire que je ne dis que des idioties en MP.
 
WRInaute accro
Pour utiliser exactement le même type de règle, tu peux récupérer page_id avec $_GET[page_id]

La règle que Koogar t'as donnée est celle que j'utilise, et qui fonctionne.
 
WRInaute impliqué
Le diable est dans les détails comme disent les américains.

Voici un .htaccess:
Code:
AddType x-mapp-php5 .php

Options +FollowSymLinks

RewriteEngine On

RewriteRule ^(.*)\.html  /page.php?page_id=$2&page_title=$1 [NS,L]

Les deux premières lignes sont pour un hébergement 1and1.

Voici le code de page.php:

Code:
<?php
echo 'page_id='.$_GET['page_id'].' page_title='.$_GET['page_title'];
?>

Voici une requête (je peux donner par MP le NDD si quelqu'un veut vérifier de visu tout ce que je dis):

Code:
http://xxxx.com/toto.html

Voici ce que ça imprime:

Code:
page_id= page_title=toto

page_id n'est pas défini. C'est ce que je dis depuis le début. Et page_id n'est pas défini car $2 n'est pas défini dans la règle car il n'y a qu'une seule paire de parenthèses dans l'expression régulière.

Vous pouvez tourner ça dans le sens que vous voulez, c'est comme ça. Et n'importe qui peut refaire ce test.

Je ne sais toujours pas ce que le test de Koogar fait par contre. Ce serait bien de le savoir.
 
WRInaute accro
bah, qu'est ce que vous dites ?

si il veut recuperer 2 valeurs, c'est à dire page_id et page_title, il doit faire passer ces 2 valeurs dans l'url, à moins de faire la correspondante en php. donc dans ce cas, il devra faire une url du type :

1,accueil.html ou 1-accueil.html (ou accueil-1, c'est lui qui voit)
et dans ça regle de rewrite quelquechose du genre (0-9+),(.+).html vers /page.php?page_id=$1&page_title=$2 (ou inverse)

accueil.html, quelquesoit son rewrite, ne va pas inventer tout seul que l id d'accueil est 1, à moins d'aller le chercher dans la base de données ou autre.
 
WRInaute impliqué
e-kiwi a dit:
bah, qu'est ce que vous dites ?

si il veut recuperer 2 valeurs, c'est à dire page_id et page_title, il doit faire passer ces 2 valeurs dans l'url, à moins de faire la correspondante en php. donc dans ce cas, il devra faire une url du type :

1,accueil.html ou 1-accueil.html (ou accueil-1, c'est lui qui voit)
et dans ça regle de rewrite quelquechose du genre (0-9+),(.+).html vers /page.php?page_id=$1&page_title=$2 (ou inverse)

accueil.html, quelquesoit son rewrite, ne va pas inventer tout seul que l id d'accueil est 1, à moins d'aller le chercher dans la base de données ou autre.

Merci.
 
Discussions similaires
Haut