Url rewrite

Nouveau WRInaute
Bonjour à tous et à toutes,
Je viens vers vous car cela plusieurs jours que je plante sur la réécriture d’url de mon site internet, et la je ne vois pas comment je pourrais m’en sortir.
J’ai pourtant lu pas mal de sujet du forum et de la doc, mais je vous l’avoue je pêche un peu.

Un grand merci d’avance à ce qui pourrait me faire progressé dans l’obscurité de l’url rewrite.

Avant tout, voici les différentes structures des urls de mes pages

?page=111&metier=0035

voici le fichier htaccess


Code:
Options +FollowSymlinks
RewriteEngine On


RewriteRule ^metier-([0-9]+)-([0-9]+)\.html$  index.php ?page=$1&metier=$2  [L]

cela fonctionne et me donne bien :

metier-111-35.html

le première question que je me pose c’est :
dans ce cas je souhaiterais mettre en place une condition pour dire si c’est la page 111 alors on commence par metier-XX-XXX.html, mais si c’est page=44 alors on commence par actu-XX-XXX.html.

La deuxième question que je me pose c’est qu’au lieu d’avoir

metier-111-35.html j’obtienne metier-assistante-de-direction.html si le metier 35 est renseigné dans ma base de données comme libelle assistante de direction ?

Mais la du coup, je ne vois absolument pas comment appréhender cette problèmatique.

Merci encore si quelqu’un peut m’apporter un peu de lumière.

Aurore
 
WRInaute discret
aurore2322 a dit:
le première question que je me pose c’est :
dans ce cas je souhaiterais mettre en place une condition pour dire si c’est la page 111 alors on commence par metier-XX-XXX.html, mais si c’est page=44 alors on commence par actu-XX-XXX.html.

Tu auras besoin de RewriteCond. Si tu as un problème ou que tu n'y arrives pas, dis-le et on verra ensemble.

aurore2322 a dit:
La deuxième question que je me pose c’est qu’au lieu d’avoir

metier-111-35.html j’obtienne metier-assistante-de-direction.html si le metier 35 est renseigné dans ma base de données comme libelle assistante de direction ?

Tu dois faire ça du côté PHP et non dans ton htaccess malheureusement.
 
Nouveau WRInaute
Bonjour Giustino et merci pour ta réponse

en fait j'avais commencé à regarder avec RewriteCond mais ça ne fonctionnait pas.
Le pense que ma regle n'est pas bonne. Je pensais mettre en place condition avec query_string ?

Code:
Options +FollowSymlinks
RewriteEngine On

RewriteCond %{query_string} ^page=20$
RewriteRule ^index\.php$ /metier.html? [R=301,L]

RewriteCond %{query_string} ^page=50$
RewriteRule ^index\.php$ /stage.html? [R=301,L]

#RewriteRule ^metier-([0-9]+)-([0-9]+)\.html$  index.php ?page=$1&metier=$2  [L]

 

suis-je sur la bonne piste ?

Merci d'avance.
 
Nouveau WRInaute
Pour ce qui est du PHP, côté génération du lien en dynamique en fait j'y suis presque sauf que ca ne marche pas dans certain cas :

metier_0014_203_charge-d-encadrement.html ne me renvoyait pas vers la page du coup j'ai ajouté un troisième paramètre dans la règle ci-dessous et dans ce cadre la ça ne fonctionne que si mon métier n'est constitué que d'un seul mot.

par contre

metier_0014_203_toto.html me renvoie vers la bonne page.

Du coup peut on éviter d'avoir à insérer param $3 ?
Sinon quelle est la règle pour avoir en 3ème paramêtre [a-z] et facultativement - (tiret)


Code:
RewriteRule ^metier_([0-9]+)_([0-9]+)_([a-z]+)\.html$  index.php?page=$1&metier=$2&libelle=$3  [L]


Merci d'avance.
 
WRInaute discret
C'est en effet une bonne piste au niveau du RewriteCond et du %{QUERY_STRING} mais peux-tu (re)dire exactement ce que tu veux (chaque cas) au niveau redirection etc.

Pour autoriser le tiret avec les lettres de a à z minuscules, voici la syntaxe:
Code:
[a-z\-]

Tout simplement :)
 
Nouveau WRInaute
Merci Giustino pour ta participation.
j'ai réussi à faire à peu près ce que je voulais.
ave ton info sur [a-z\-]

Mais du coup je me pose un question sur le Duplicate content

En fait j'ai des pages sur ce format qui sont indexés par Google :
index.php?page=10&metier=14
index.php?page=10&metier=43
...

le problème c'est qu'avec ma réécriture suivante :

Code:
RewriteRule ^metier_([0-9]+)_([0-9]+)_([a-z]+)\.html$  index.php?page=$1&metier=$2&libelle=$3  [L]

j'obtiens une nouvelle url du type

metier_maitre_nageur_10_14.html
directeur_10_43.html

qui vont être indexé par Google et du coup deux adresses pour la même page donc contenu dupliqué.
Et en fait j'ai un sacré paquet de page comme ça du coup je ne vais pas pouvoir faire des redirection 301 pour chacune d'elle du coup je voulais savoir si je pouvais automatiser ça en 301 avec une RewriteRule

Merci d'avance.
 
Nouveau WRInaute
Merci Giustino pour ta participation.
j'ai réussi à faire à peu près ce que je voulais.
ave ton info sur [a-z\-]

Mais du coup je me pose un question sur le Duplicate content

En fait j'ai des pages sur ce format qui sont indexés par Google :
index.php?page=10&metier=14
index.php?page=10&metier=43
...

le problème c'est qu'avec ma réécriture suivante :

Code:
RewriteRule ^metier_([0-9]+)_([0-9]+)_([a-z]+)\.html$  index.php?page=$1&metier=$2&libelle=$3  [L]

j'obtiens une nouvelle url du type

metier_maitre_nageur_10_14.html
directeur_10_43.html

qui vont être indexé par Google et du coup deux adresses pour la même page donc contenu dupliqué.
Et en fait j'ai un sacré paquet de page comme ça du coup je ne vais pas pouvoir faire des redirection 301 pour chacune d'elle du coup je voulais savoir si je pouvais automatiser ça en 301 avec une RewriteRule

Merci d'avance.
 
Nouveau WRInaute
En fait j'ai trouvé une solution pour l'automatisation en PHP en faisant un boucle sur mes tuples ce qui me génère un ensemble de ligne comme celle-ci :

Code:
RewriteCond %{REQUEST_URI} /?page=10&metier=34
RewriteRule ^(.*) /metier_surveillant-de-nuit_0034_10.html [L,R=301]

Sauf que ma redirection ne fonctionne pas. Une idée ?

Autre interrogation, est-ce qu'il est possible que mon fichier htaccess contenant un grand nombre de redirection 301, environ 4000 lignes comme celles au dessus puisse pénaliser le référencenement du site internet ?


ou pas ? à mon sens non, mais bon je préfère avoir votre avis.

Merci d'avance
:)

Aurore
 
Olivier Duffez (admin)
Membre du personnel
désolé, j'arrive après la bataille, mais ça sert à quoi de gérer tout ça dans le .htaccess, avec toutes ces conditions ?
car 4000 lignes c'est impensable

pourquoi ne pas tout simplement gérer les redirections dans le PHP ?
si l'URL demandée n'est pas celle attendue, alors tu fais une 301 vers l'URL officielle (la canonique)

au passage, remplace tes underscore par des tirets, car le signe underscore n'est pas un séparateur de mots pour Google
 
Nouveau WRInaute
Bonsoir et merci pour ta réponse.... Je vais changer l.underscore :)
Si je voulais faire ça dans htacess c est que je ne vois pas bien comment faire ca en php...
Comment puis je traiter ca?
Unenpetite piste

Merci d.avance
 
Nouveau WRInaute
Merci pour ta réponse,
je viens de regarder sauf que dans mon cas la variable d'environnement serveur me renvoie le fichier PHP qui génére ma fiche sans les parametres.

En gros mon page index.php?page=12&metier=14 si je fais $_SERVER[URI] cela me retourne display_result.php qui est le fichier qui recoit en ajax ma fiche.

Du coup la je comme à être inquiète.
y aurait'il une autre solution ? est ce totalement pénalisable d'avoir 4000 redirections dans htaccess. (ralenti lecture site ? ou autre ?)

Merci pour vos pistes.
Aurore.
 
Nouveau WRInaute
j'ai bien regardé en faisant un print_r($_SERVER) je n'ai aucune info qui me permet de connaitre l'url de la page, je n'ai que l'url du fichier qui recoit la function f_open de php.

Je crois que la solution avec le header ne peut pas se faire dans mon cas.

pas d'info sur le nombre de ligne dans le htaccess? vraiment une hérésie ?
 
Olivier Duffez (admin)
Membre du personnel
redis-nous exactement ce que tu as comme URL et vers quoi tu veux la rediriger
ainsi que le contenu de SERVER
 
Nouveau WRInaute
Merci pour votre aide et ta patience.

Mes pages indexées dans google sont de la forme :
/index.php?page=2&metier=33

Ensuite j'ai codé une nouvelle url avec PHP pour inclure après lecture de la table métier l'intitulé du métier.
et la réécriture donne comme url :
/metier-conducteur-de-travaux-2-33.html suivant la règle du htaccess suivante :

Code:
RewriteRule ^metier-([a-z]+)-([0-9]+)-([0-9]+)\.html$  index.php?page=$1&metier=$3&libelle=$1  [L]

et mon contenu $_SERVEUR me donne :

Code:
Array ( [HTTP_HOST] => metier.demo [CONTENT_LENGTH] => 819 [CONTENT_TYPE] => application/x-www-form-urlencoded [PATH] => /usr/bin:/bin:/usr/sbin:/sbin [SERVER_SIGNATURE] =>
Apache/2.0.63 (Unix) PHP/5.2.13 DAV/2 Server at metier.demo Port 80
[SERVER_SOFTWARE] => Apache/2.0.63 (Unix) PHP/5.2.13 DAV/2 [SERVER_NAME] => metier.demo [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /Volumes/www/metier/[SCRIPT_FILENAME] => /Volumes/www/metier/front/modules/metier_search/display_result.php [REMOTE_PORT] => 51943 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.0 [REQUEST_METHOD] => POST [QUERY_STRING] => [REQUEST_URI] => /front/modules/metier_search/display_result.php [SCRIPT_NAME] => /front/modules/metier_search/display_result.php [PHP_SELF] => /front/modules/metier_search/display_result.php [REQUEST_TIME] => 1379687473 [argv] => Array ( ) [argc] => 0 )

Merci d'avance pour votre aide
 
Nouveau WRInaute
ma question est :

compte tenu de la situation j'ai deux url pour un même contenu donc duplicate content pour Google.
Du coup je voulais spécifier des redirections 301 pour dire en gros

si tu trouves /index.php?page=10&metier=34 alors redirection 301 vers url reecrite :
Code:
RewriteCond %{REQUEST_URI} /?page=10&metier=34
RewriteRule ^(.*) /metier_surveillant-de-nuit_0034_10.html [L,R=301]

et ce pour toutes les pages (même si j'en ai 2000)

hérésie ?
 
Olivier Duffez (admin)
Membre du personnel
tu mélanges 2 serveurs (test et prod), non ?
car je vois display_result.php alors que ça devrait être index.php
 
Nouveau WRInaute
non, en fait c'est que display_result est plaqué en f_open dans l'index.php à travers différentes fonctions.

je vais essayer de tester en amont du coup, mais sinon on ne peut pas faire coller trop de ligne dans htaccess ?
 
Olivier Duffez (admin)
Membre du personnel
non il ne faut pas utiliser .htaccess dans ce cas

dans index.php, au début du script, tu testes si l'URL demandée est du type index.php?page=X&metier=Y
si c'est le cas, tu récupères via une requête mysql les libellés à mettre dans l'URL et tu fais une redirection (en PHP) vers la bonne URL
 
Nouveau WRInaute
Super ça a l'air de fonctionner, je n'avais pas pensé à court-circuiter mes f_open ajaxx et attaquer directement le fichier index.php

Merci beaucoup de ta patience.
Seul petit bémol mais j'ai un boucle de redirection en faisant comme cela.

C'est à dire un test brut à la racine index.php :

Code:
if (isset($_GET["page"])&& isset($_GET["metier"]) && $_GET["metier"]==14 && $_GET["page"]==10)
         { 
         header("Status: 301 Moved Permanently", false, 301);
         header("location:http://local/metier-conducteur-travaux-10-14.html");
         exit;
         }

avec le fichier .htaccess suivant :

Code:
RewriteRule ^metier-([a-z]+)-([0-9]+)-([0-9]+)\.html$  index.php?page=$2&metier=$3&libelle=$1  [L]

Là, du coup, je ne comprends pas pourquoi ...
 
Olivier Duffez (admin)
Membre du personnel
je t'ai conseillé de tester si l'URL demandée est du type index.php?page=X&metier=Y
et toi tu testes si les variables sont connues, mais elles le sont que l'URL soit du type index.php?page=X&metier=Y ou metier-conducteur-travaux-10-14.html
 
Nouveau WRInaute
@Giustino : j'ai lu ton exemple mais du coup je ne vois pas trop si cette variable je dois l'ajouter dans htaccess ou dans la redirection 301 en php

@Olivier : effectivement j'ai testé dans une premier temps pour voir si un test sur l'url et une redirection pouvait fonctionner dans le fichier index. Du coup effectivement mon print_r($_SESSION) me donne bien ici une url avec mes GET.

pour ce qui est du test je ne suis pas super sûre de mon coup :


Code:
$url = $_SERVER['REQUEST_URI'];
if (preg_match('#^/?page=+.[a-zA-Z]&metier=+.[0-9]#i', $url))
		{
		header("Status: 301 Moved Permanently", false, 301);
		header("Location: http://local/".$url_attendue);
		exit;
		}

Y-at'il un autre moyen qu'avec une regex ?

Désolé pour mes incompétences et mes maladresses, je rame un peu mais je vous suis reconnaissante pour vos coups de pouces
 
Nouveau WRInaute
ok je vais approfondir cela,
mais du coup cela va t'il pallier à ma boucle de redirection ou vais-je devoir introduire un paramètre comme me l'a suggéré Giustino ?
 
Nouveau WRInaute
merci encore pour votre aide.
Je sens que je ne suis plus très loin de but, mais je butte sur la redirection en boucle.

j'ai essayé de rajouter un paramètre &stop dans la Rewrite Rule dans mon htaccess mais cela ne change rien au niveau de ma boucle de redirection.

Code:
RewriteRule ^metier-([0-9a-zA-Z_-]+)-([0-9]+)-([0-9]+)\.html$  index.php?page=$3&metier=$2&libelle=$1&stop  [L]

Est ce que j'ai oublié ou mal placé quelquechose ?? une idée ?
Merci d'avance.
 
WRInaute discret
Ah donc même avec php tu as cette boucle de redirection ? Je pensais que ça ne ferait pas la même chose qu'avec le htaccess.
Le principe est correct, et dans ton code php tu dois vérifier quelque chose du style:

Code:
if (!isset($_GET['stop']))
     // faire la redirection vers l'url réécrite

afin de ne pas réécrire en boucle (si la variable "stop" est détectée cela veut dire que l'url entrée est bien le format réécrit mais il pointe sur cette page malgré tout, à la seule différence que la variable "stop" permet de définir l'état de redirection.
 
Nouveau WRInaute
Super !!! ça fonctionne.
Un grand merci vraiment sincère pour votre aide avec un peu de retard tout de même.
Du coup il ne me reste plus qu'à mettre cela en place/

Du coup url rewriting et redirection 301 ne devrait pas me faire perdre mon positionnement si je le mets en place ?
 
WRInaute discret
aurore2322 a dit:
Du coup url rewriting et redirection 301 ne devrait pas me faire perdre mon positionnement si je le mets en place ?

Si tu l'utilises judicieusement et que c'est mis en place correctement, alors tu ne peux qu'améliorer ton référencement (ou du moins, ne pas le détériorer)
 
Discussions similaires
Haut