eclairage sur les principes de l'url rewriting

Nouveau WRInaute
Bonjour.

après avoir mis en place avec succès mes 1es réécritures d'Url, en m'appuyant notamment sur cet excellent tuto https://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting,
je m'aperçois avec stupeur que j'escomptais un tout autre résultat.

Je pensais que le serveur allait me renvoyer ma page exemple.php?var=$1&var2=$2... avec une url réécrite (exemple-$1-$2.html par ex.).

Or c'est l'inverse. C'est en appelant exemple-$1-$2.html que j'affiche sa déclinaison php.

Donc si je veux que les moteurs et les clients lisent l'URL exemple-$1-$2.html au lieu de l'URL php, que dois-je mettre en place en sus d'un bon .htaccess ?

Ne suis-je donc qu'un sot?

Merci.
 
WRInaute impliqué
Le moteur de rewriting sert à extraire des variables (selon la ou les règles que tu définis dans le fichier .htaccess) à partir d'URL qui sont présentes dans ton site, et à les transmettre au module php sous forme de variables globales.

au lieu de placer des url encodées sous la forme peu lisible par les moteur de reherche exemple.php?var=$1&var2=$2

tu peux, une fois la regle mise en place, les écrire sous cette forme : exemple-1-2.html
 
WRInaute accro
Tu as du mal lire un truc ...
il faut que les liens de ton site soient :
Code:
<a href="exemple-$1-$2.html">lien</a>

Si c'est l'URL de ta page PHP qui est affichée, c'est qu'il y a un binz
 
Nouveau WRInaute
Ce qui implique notamment que je doive réécrire tous les liens internes du site au format html, après avoir mis en place les règles de réécriture?

Dans le cas d'un formulaire de recherche avec de multiples entrées par exemple, qui génère des pages à 7 variables et où les combinaisons de sortie sont innombrables, comment faire?

D'une manière générale je ne vois pas très bien comment effectuer la mise en place pour les pages dynamiques? Ce n'est pas la reecriture en soi qui me pose probleme, mais la mise en place globale.

Enfin, quid du pb de contenu dupliqué, lorsque GGBot indexera des pages dont il a déjà le contenu sous une autre URL?

Merci.
 
WRInaute accro
Alors :

Pour les pages issues des formulaire, pas de souci, les moteurs ne savent pas utiliser les formulaires.

Pour le reste, Oui, il te faudra ;

- modifier tous les liens du site au format "réécrit"
- mettre en place des redirections 301 des pages exemple.php?var=$1&var2=$2... vers les pages exemple-$1-$2.html pour éviter le duplicate content.
 
Nouveau WRInaute
C'est beaucoup plus clair a présent, merci.

Dernier éclaircissement, mais au pire je retournerai fouiller dans les multiples topics qui semblent parler de ça.

Au sujet des redirects 301, si je termine ma RewriteRule ^test\.html$ /test.php par [R=301], c'est la page html qui est redirigée vers la page php et non l'inverse. Bigre.

ET même si on sort on peut du cadre de ce topic, Il doit bien y avoir une solution pour indexer et mettre a dispo des moteurs des urls réécrites a partir de ces pages générées par formulaire? Une piste? Sinon c'est un matériel de référencement fantastique qui est gaspille.

merci en tous cas pour vos réponses rapides et claires. Voila du forum comme on aime :D
 
WRInaute impliqué
En fait, tu veux le beurre et l'argent du beurre :wink:

Les pages html doivent etr einterpretées par des pages php
les pges php doivent etre récrites en html.

C'est possible, en utilisant un paramètre bidon en plus (merci webmasterlamogere...).

Par exemple si on a les pages exemple-par1-par2.html et exemple.php?var1=par1&var2=par2, tu peux utiliser les deux règles suivantes, de mémoire:

Code:
RewriteRule ^exemple-([^-]+)-([^-]+)\.html exemple.php?stop&var1=$1&var2=$2 [L]

RewriteCond %{QUERY_STRING} ^var1=(.*)&var2=(.*)$
RewriteRule exemple\.php exemple-%1-%2.html? [R=301,L]

La premiere doit correspondre plus ou moins a ce que tu fais déjà. La deuxième est une redirection externe des php vers les html. Ca permet d'indexer les html au lieu des php dans les moteurs.

Edit: j'ai changé de place le parametre stop
 
Nouveau WRInaute
Merci pour l'argent du beurre 8)

Je testerai dans le w-end, avant de revenir poster le résultat des courses.
 
Nouveau WRInaute
Bonjour. Happé par d'autres projets en cours, j'avais laissé ce sujet en plan, mais pas oublié! :)
En effet, super le tuyau de redirect permanent:
Code:
#RewriteRule ^([0-9]+)-biathlon-handisport-([^/]+)$  /actus.php?stop&num=$1&titre=$2 [L]
#RewriteCond %{QUERY_STRING} ^num=(.*)&titre=(.*)$
#RewriteRule actus\.php http://www.monsite.fr/%1-biathlon-handisport-%2? [R=301,L]
Je poste ce up pour ce qui suit, car là, oh stupeur, ça ne marche plus, ça fait à peu près 69 fois que je vérifie la similitude du code, mais NADA, la redirection ne s'effectue pas quand je saisis l'URL dynamique?! :roll:
Code:
RewriteRule ^/page,([0-9]+)$              /index.php?stop&page=$1 [L]
RewriteCond %{QUERY_STRING} ^page=(.*)$
RewriteRule index\.php http://www.monsite.fr/zenphoto/page,%1? [R=301,L]

WRInautes éclairés, ne me laissez pas dans mon obscure ignorance.
 
WRInaute impliqué
Tu as mis un / de trop au début de ta première règle ...

Essaie ça:

Code:
RewriteRule ^page,([0-9]+)$              /index.php?stop&page=$1 [L]
RewriteCond %{QUERY_STRING} ^page=(.*)$
RewriteRule index\.php http://www.monsite.fr/zenphoto/page,%1? [R=301,L]
 
Nouveau WRInaute
Hello Vap merci pour ta réponse

Non si j'enlève ce / je me retrouve à un mauvais niveau d'arborescence et je perds tous les liens vers les css et les js.
La 1e règle fonctionne d'ailleurs bien:

Code:
RewriteRule ^/page,([0-9]+)$              /index.php?stop&page=$1 [L]
C'est le redirect permanent qui ne marche pas:

Code:
RewriteCond %{QUERY_STRING} ^page=(.*)$
RewriteRule index\.php http://www.monsite.fr/zenphoto/page,%1? [R=301,L]

J'ai bien mis le stop de lamogère :) dans la rewriteRule, j'ai vérifié le RewriteCond...

Pourtant si la condition était vérifiée il devrait se passer qq chose, même mal?
 
WRInaute impliqué
Ta page index.php est à la racine?

Essaie d'enlever tout sauf ce qui suit pour tester cette règle:

Code:
RewriteRule index\.php http://www.monsite.fr/zenphoto/page? [R=301,L]

Si tu entres -http://www.monsite.fr/index.php l'adresse doit etre changée en -http://www.monsite.fr/zenphoto/page

Ensuite tu met la règle complete:

Code:
RewriteCond %{QUERY_STRING} ^page=(.*)$
RewriteRule index\.php http://www.monsite.fr/zenphoto/page,%1? [R=301,L]

Si tu entres -http://www.monsite.fr/index.php?page=1 l'adresse doit etre changée en -http://www.monsite.fr/zenphoto/page,1
 
Nouveau WRInaute
Non, c'est l' index.php du répertoire /zenphoto/ et j'ai un RewriteBase /zenphoto

pour y voir plus clair voici l'intégralité du .htaccess

Code:
# répertoire zenphoto

RewriteEngine On
RewriteBase /zenphoto
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^.*$ - [R,L]
RewriteRule	^admin/?$	                     zen/admin.php [R,L]

#règle citée dans le topic, seule la 1e ligne fonctionne:
#RewriteRule ^/page,([0-9]+)$              /index.php?stop&page=$1 [L,QSA]
#RewriteCond %{QUERY_STRING} ^page=(.*)$
#RewriteRule /index\.php /page,%1? [R=301,L]

#ou, ce qui revient au même que ci-dessus, ici c'est la 3e ligne qui fonctionne:
RewriteCond %{QUERY_STRING} ^page=([0-9]+)$
RewriteRule ^index\.php$ /page,%1? [R=301,L]
RewriteRule ^/page,([0-9]+)$ /index.php?page=$1&rw [L,QSA]

#idem, seule la 1e ligne fonctionne
RewriteRule ^([^/]+)/?$                    index.php?stop&album=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^album=(.*)$
RewriteRule index\.php http://www.objectif-vancouver-2010.fr/zenphoto/%1/? [R=301,L]


#celle-ci n'a pas encore son R=301
RewriteRule ^([^/]+),page,([0-9]+)?$      index.php?album=$1&page=$2 [L,QSA]

Merci
 
WRInaute impliqué
Tu as mis un RewriteBase /zenphoto ou RewriteBase /zenphoto/ ?

En principe, les répertoires finissent par / dans apache.

Si tu n'a pas mis le / à la fin, je comprend qu'il faille que tu le mette au début de chaque règle...

Le .htaccess que tu as mis est a la racine, ou dans /zenphoto/ ?
 
Nouveau WRInaute
J'ai mis RewriteBase /zenphoto

Le .htaccess est dans /zenphoto/

LOgik ton commentaire sur les /

je mets ça au propre de suite
 
Nouveau WRInaute
OK pour les / inutiles qui trainaient
A présent donc pour ne prendre que le début du .htaccess jusqu'à la 1e règle qui pose problème on a:

Code:
RewriteEngine On
RewriteBase /zenphoto/

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^.*$ - [R,L]
RewriteRule	^admin/?$	          	zen/admin.php [R,L]

RewriteCond %{QUERY_STRING} 		^page=([0-9]+)$
RewriteRule ^index\.php$ 			page,%1? [R=301,L]
RewriteRule ^page,([0-9]+)$ 		index.php?page=$1&rw [L,QSA]

la redirection 301 ne marche tjs pas
Serait-ce lié aux 1res RewriteCond?
 
Nouveau WRInaute
Si je commente les RewriteCond %{REQUEST_FILENAME} , la réécriture et le redirect marchent pour index.php?page= , mais pas pour index.php?album= avec des règles strictement identiques. :roll:

J'ai aussi testé en php.

Code:
$URi = $_SERVER["REQUEST_URI"];
$motif = "'(/index\.php\?page=)+([0-9]+)'";
if (preg_match($motif,$URi,$capture)) 	{
	header("Status: 301 Moved Permanently");
	header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/page,$capture[2]");
		exit;
}

Merveilleux bout de code merci http://www.urlrewriting.fr, :) mais même résultat quand j'applique ce code a la var album:

Code:
$motif2 = "'(/index\.php\?album=)+(.*)'";
if (preg_match($motif2,$URi,$capture2)) 	{
	header("Status: 301 Moved Permanently");
	header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/$capture2[2]");
	exit;
}


A savoir index.php?page=2 est bien redirigé vers page,2 mais index.php?album=handbike-provence ne renvoie pas vers handbike-provence

Est-ce que la REGEX (.*) est en cause?

J'avoue, plus je teste moins je comprends et ça commence à me ficher un mal de crâne sympa l' URL-RW :evil:
 
WRInaute impliqué
raoux a dit:
OK pour les / inutiles qui trainaient
A présent donc pour ne prendre que le début du .htaccess jusqu'à la 1e règle qui pose problème on a:

Code:
RewriteEngine On
RewriteBase /zenphoto/

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteRule ^.*$ - [R,L]
RewriteRule	^admin/?$	          	zen/admin.php [R,L]

RewriteCond %{QUERY_STRING} 		^page=([0-9]+)$
RewriteRule ^index\.php$ 			page,%1? [R=301,L]
RewriteRule ^page,([0-9]+)$ 		index.php?page=$1&rw [L,QSA]

la redirection 301 ne marche tjs pas
Serait-ce lié aux 1res RewriteCond?

La première règle dit que si ta requete ne correspond ni a un fichier ni a un repertoire existants, alors on ne renvoie rien... Donc elle attrape toutes tes requêtes html.

Change la en:
Code:
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteCond !\.html$
RewriteRule ^.*$ - [R,L]

Comme ça tu laisse passer les requêtes vers des pages html.
 
Nouveau WRInaute
Vap a dit:
La première règle dit que si ta requete ne correspond ni a un fichier ni a un repertoire existants, alors on ne renvoie rien... Donc elle attrape toutes tes requêtes html.

Change la en:
Code:
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteCond !\.html$
RewriteRule ^.*$ - [R,L]

Comme ça tu laisse passer les requêtes vers des pages html.

Ta modif me renvoie une erreur 500, d'autre part qu'entends tu par requête html, si je n'ai que des fichiers php? les url réécrites?
 
WRInaute impliqué
Excuses moi, j'ai fait une grosse typo:

Code:
RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteCond %{REQUEST_FILENAME} !\.html$
RewriteRule ^.*$ - [R,L]

Autre chose que j'avais zappé, tu ne met pas d'extension au URL que tu veux réécrire. Ca ne me parait pas une bonne idée du tout, car l'extension indique le type mime du fichier, en l'occurence html.

Donc, si tu ne veux pas mettre d'extension, le mieux est de supprimer cette règle.
 
Nouveau WRInaute
J'ai suivi tes conseils, j'ai modifié le php pour avoir des url en html, idem pour le .htaccess.

J'ai donc à présent une réécriture propre avec extension html, qui fonctionne.
Je suis juste chagriné par une ou deux virgules de trop qui trainent dans ma RW, du style ",page,2.html"
mais c'est juste un problème d'explode à modifier dans le php, et de règle à affiner conjointement. Je ferai ça ce we.

Cette partie est donc bien pigée je crois, merci Vap. :D

Ceci étant j'ai tjs le même pb de redirection 301. J'ai bien le tuyau de webmasterlamogère, avec sa variable bidon à ajouter pour éviter de boucler en rond,
mais la redirection ne se fait pas, comme si la condition n'était pas remplie?

Ma prose:

Code:
# répertoire zenphoto
RewriteEngine On
RewriteBase /zenphoto/

RewriteCond %{REQUEST_FILENAME} -f [NC,OR]
RewriteCond %{REQUEST_FILENAME} -d [NC]
RewriteCond %{REQUEST_FILENAME} !\.html$
RewriteRule ^.*$ - [R,L] 

## RW + 301 => version redirect d'abord
RewriteCond %{QUERY_STRING} 				^page=([0-9]+)$
RewriteRule ^index\.php$ 					page,%1\.html? [R=301,L]
RewriteRule ^page,([0-9]+)\.html$ 			index.php?page=$1&rw [L,QSA]

## idem pour un autre masque d'URL
RewriteCond %{QUERY_STRING}					^album=([^/]+)$
RewriteRule index\.php$ 					%1\.html? [R=301,L]
RewriteRule ^([^/]+)\.html?$				index.php?album=$1&rw [L,QSA]

## version RW d'abord
RewriteRule ^([^/]+)\.html?$               	index.php?stop&album=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^album=(.*)$
RewriteRule index\.php 						%1\.html? [R=301,L]

# RW seules, pas encore mis de redirection
RewriteRule ^([^/]+),page,([0-9]+)?$      index.php?album=$1&page=$2 [L,QSA]
RewriteRule ^([^/]+)/image/(thumb|[0-9]{1,4})/([^/\\]+)$    zen/i.php?a=$1&i=$3&s=$2 [L,QSA]
RewriteRule	^admin/?$	          			zen/admin.php [R,L]

OU la solution php: c'est marrant ce qui suit marche pour un format d'URL mais pas pour l'autre :roll:

Code:
<?php 
	$URi = $_SERVER["REQUEST_URI"];
	
	$motif = "'(/index\.php\?page=)+([0-9]+)'";
	if (preg_match($motif,$URi,$capture)) 	{
		header("Status: 301 Moved Permanently");
		header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/page,$capture[2].html");
		exit;//OK
	}
	 
	$motif2 = "'(/index\.php\?album=)+(.*)'";
	if (preg_match($motif2,$URi,$capture)) 	{
		header("Status: 301 Moved Permanently");
		header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/$capture[2].html");
		exit;//ne marche pas
	} 
?>

Any idea? Merci bien. C'est passionnant, mais c'est pointu quand même!
 
WRInaute impliqué
IL y a encore un problème. Si on prend ces deux règles:
Code:
## RW + 301 => version redirect d'abord
RewriteCond %{QUERY_STRING}             ^page=([0-9]+)$
RewriteRule ^index\.php$                page,%1\.html? [R=301,L]
RewriteRule ^page,([0-9]+)\.html$          index.php?page=$1&rw [L,QSA]

Si tu as une requete page,1.html, la deuxième règle s'applique, tout baigne.

Si tu as une requête index.php?page=1 , la premièere regle s'applique, donc l'url est réécrite en page,1.html.

Et ça s'arrête là parce que tu as mis un L a droite, qui veut dire que c'est la dernière règle a applique ('L' veut dire Last).
 
Nouveau WRInaute
Vap a dit:
Si tu as une requête index.php?page=1 , la premièere regle s'applique, donc l'url est réécrite en page,1.html.

Et ça s'arrête là parce que tu as mis un L a droite, qui veut dire que c'est la dernière règle a applique ('L' veut dire Last).

Justement pas et c'est bien ça le souci. si j'ai une requête index.php?page=1 , l'url n'est jamais réécrite en page,1.html. :cry:

(sauf à passer par le php. )
 
Nouveau WRInaute
redirect php versus htaccess

Edit (pour la qualité de ce forum, j'ai préféré effacer qq inepties php du pseudo-débutant que je suis).

Résultat des courses, c'est tout bon. Via htacces, less is more... j'ai fait un peu de ménage, et je crois avoir compris que l'on doit placer les règles de la plus complexe vers la moins complexe :
Code:
# répertoire zenphoto
RewriteEngine On
RewriteBase /zenphoto/

RewriteRule	^admin/?$	          				zen/admin.php [R,L]

### album & page
RewriteRule ^([^/]+),page,([0-9]+).html?$       index.php?stop&album=$1&page=$2
RewriteCond %{QUERY_STRING} 	^album=([^/]+)&page=([[:digit:]]+)$
RewriteRule index\.php 							%1,page,%2\.html? [R=301,L]

### page
RewriteRule ^([^/]+)\.html?$               		index.php?stop&page=$1
RewriteCond %{QUERY_STRING} 	^page=([^/]+)$
RewriteRule index\.php 							page,%1\.html? [R=301,L]

### album
RewriteRule ^([^/]+)\.html?$               		index.php?stop&album=$1
RewriteCond %{QUERY_STRING} 	^album=([^/]+)$
RewriteRule index\.php 							%1\.html? [R=301,L]

RewriteRule ^([^/]+)/image/(thumb|[0-9]{1,4})/([^/\\]+)$    zen/i.php?a=$1&i=$3&s=$2 [L,QSA]

En php cela fonctionne aussi, en testant $_GET simplement. Exemple :

Code:
if(isset($_GET['album']) && isset($_GET['page'])){
	header("Status: 301 Moved Permanently", false, 301);
	header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/".$_GET['album'].",page,".$_GET['page'].".html");
	exit();
}
elseif(preg_match("'(/index\.php\?album=)+(.*)'",$_SERVER["REQUEST_URI"],$capture)) {
	header("Status: 301 Moved Permanently");
	header("Location: http://www.objectif-vancouver-2010.fr/zenphoto/$capture[2].html");
	exit;
}

Cela ne me dit pas quelle méthode est à privilégier?

En tout cas merci à Vap qui m'a permis d'y voir clair. La patience est mère de toutes les vertus! :wink:
 
WRInaute impliqué
Il faudrait mesurer le sperformances, mais je pense qu'il est plus efficace de passer par le fichier .htaccess .
 
Discussions similaires
Haut