URL "foireuses" à rediriger et problème avec .htac

Nouveau WRInaute
Après analyse en profondeur d'un site, j'ai remarqué que d'anciens URL Rewritings foireux (espaces, caractères accentués, etc), corrigés depuis, étaient toujours présents dans les résultats de Google.
Jusque là, pas trop grave, sauf que si on a une URL du genre :
page-1-bête erreur-2.html (qui renvoie sur page.php?num=$1&nom=$2&type=$3)

Dans les résultats de Google, on voit un truc du genre
page-1-b%E7te%20erreur-2.html

qui devient page-1-%C8E7te%C820erreur-2.html
ensuite page-1-%B3C8E7....

et ainsi de suite, jusqu'à trouver des trucs invraisemblables ("Liège" est devenu "LiÃfÆ'Ã?â?TÃfâ? ââ,¬â"¢ÃfÆ'ââ,¬Â Ãf¢ââ?s‰â?z¢ÃfÆ'Ã?â?TÃf¢ââ?s¬Ã.¡ÃfÆ'ââ,¬Å¡Ãfâ?sÃ,¨ge")


J'ai été jeté 1 coup d'oeil dans les résultats de Google Analytics, et chaque "version" du rewriting est indépendante des autres (logique).
Mais, d'après mes constatations ça fait du dégât du point de vue référencement (TRES mauvais positionnement des pages concernées, faut limite taper le nom de la page dans Google pour la trouver).
Mes conclusions, c'est que soit Google "dilue" la pertinence de la page entre chaque version, ou les déclasse pour duplicate content.


Pour régler ce problème, j'ai pensé à utiliser des redirections 301 dans mon .htaccess, pour à chaque fois renvoyer les "mauvais" rewritings vers le bon (et essayer de les remplacer dans l'index des moteurs de recherche).

Premier essai :
RedirectMatch Permanent page-1-b([^-]*)te([^-]*)erreur-2.html http://www.monsite.com/page-1-bete,erreur-2.html

Mais là, ça ne marche pas, Firefox me dit "Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas."

Deuxième essai :
RedirectMatch Permanent page-1-b([^t]*)te([^e]*)erreur-2.html http://www.monsite.com/page-1-bete,erreur-2.html
(ben oui, après la succession de ignes cabalistiques, on trouvera 1 t, et un e après la deuxième série)
Résultat : idem

Troisième essai :
RewriteRule ^page-1-b([^t]*)te([^e]*)erreur-2\.html$ page-1-bete,erreur-2.html [R=301]
(placé AVANT l'instruction de redirection
RewriteRule ^page-([0-9]{1,2}-([^-]*)-([0-9]{1,3})\.html$ page.php?param1=$1&param2=$2&param3=$3 [L]
)

Résultat : erreur 404...

Quatrième essai :
Même chose que le 3ème, mais en inversant les 2 instructions.

Résultat : erreur 404 aussi :(

J'ai encore essayé quelques variantes (remplacer le [L] par [R], par [QSA,L], par [R=301,L], ...), mais aucune n'a l'air de fonctionner correctement :( )


Savez-vous comment je peux faire pour "fusionner" ces URLs et faire en sorte que seule la "bonne" URL sorte à l'avenir dans les résultats de recherche?
 
WRInaute accro
si tu fais un
Code:
RewriteRule ^page-([0-9]+)-(.*)-([0-9]+)\.html$ page.php?param1=$1&param2=$2&param3=$3

--> est ce que tu peux reconstruire dans "page.php" un URI de contrôle (généré à partir par une query qui va chercher la valeur de $2 fonction de $1 et de $3 si nécessaire ?

Si tu peux, alors une comparaison de l'URI de contrôle avec $_SERVER['REQUEST_URI']; te permet de définir si:

- cas 1: l'uri est bon et aucune redirection ne doit être faite
- cas 2 : l'uri est foireux, et il faut rediriger vers $uri_de_controle.


J'applique cette méthode sur l'annuaire: http://annuaire.indexweb.info/29660/uri ... ireux.html

;)
 
WRInaute passionné
+1

Pour générer les href des liens du menu et autre il y a souvent une fonction qui détermine l'url à partir des paramètres.
Je l'utilise pour vérifier que l'url demandée est bien celle que je détermine sinon redirection 301 avec fonction header.
c'est simple et ca prend en compte le cas ou le host est sans "www." et les cas ou le path est changé volontairement ou non.
 
Nouveau WRInaute
J'ai encore une petite erreur à corriger en rapport avec ce "contrôle d'URL Rewriting".

La structure des rewritings est de type Catalogue-Numero-NomDuCatalogue-Page.html

(dansle fichier .htaccess : RewriteRule ^Catalogue-([0-9]{1,3})-[^-]-([0-9]{1,3})\.html$ Catalogue.php?id=$1&nom=$2&page=$3 [L] )

Le nombre de "pages" (3ème paramètre) peut aller de 0 à 999, et varie dans les 2 sens en fonction des opérations sur la DB.
Il est aussi possible de l'ignorer, ce qui équivaut à mettre "0".

MAIS j'ai un problème dans le cas où on a enlevé une ou plusieurs pages à un des catalogues, les anciennes URLs sont toujours indexées, cequi aboutit à des erreurs 404.
J'ai essayé d'utiliser le même principe de "contrôle d'URL Rewriting", en vérifiant si

$NomSansEspacesNiAccents ==> $_GET['nom'], en enlevant les accents, espaces, et autres crasses du genre.
$HighExistingPage ==> Le numéro de page le plus haut autorisé, si le paramètre est supérieur, on doit (normalement...) afficher la 1ère page.

Les valeurs des paramètres et variables dans le code sont tous vérifiés et toujours corrects.

Code:
if (!isset($_GET['page']))
  $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents.".html";
else
{
  if ($_GET['page']==0)
    $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents.".html";
  else
  {
    if ($_GET['page']>$HigherExistingPage)
      $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents.".html";
    else
      $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents."-".$_GET['page'].".html";
	}
}

if (strcmp($controlURL, $_SERVER['REQUEST_URI']))
{
	header("Status: 301 Moved Permanently", false, 301);
	header("Location: http://www.monsite.com".$controlURL);
}

Si je ne passe aucun numéro de page ou que je passe 0 en paramètre 'page', c'est bien la 1ère page qui s'affiche.
Si je passe un numéro de page valide, c'est la bonne page qui s'affiche.
MAIS si je passe un numéro de page trop grand, le navigateur charge dans le vide puis m'affiche à nouveau : "Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas." :cry:

Mon .htaccess :
Code:
RewriteRule ^Catalogue-([0-9]{1,3})-([^-]*)-([0-9]{1,5})-([^-]*)\.html$ Catalogue.php?id=$1&nom=$2&page=$3&ancien_param_qui_sert_juste_a_eviter_les_404=$4 [L]
RewriteRule ^Catalogue-([0-9]{1,3})-([^-]*)-([0-9]{1,5})\.html$ Catalogue.php?id=$1&nom=$2&page=$3 [L]
RewriteRule ^Catalogue-([0-9]{1,3})-([^-]*)\.html$ Catalogue.php?id=$1&nom=$2 [L]

Ca fait 2h que je m'arrache les cheveux là-dessus, tout le reste fonctionne désormais :evil:
 
WRInaute passionné
je l'écrirai différement mais je ne suis pas sur que cela corrige :

Code:
if ((!isset($_GET['page'])) || ($_GET['page']<1) || ($_GET['page']>$HigherExistingPage)) {
  $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents.".html";
} else {
  $controlURL = "/Catalogue-".$_GET['id']."-".$NomSansEspacesNiAccents."-".$_GET['page'].".html";
}
if ($controlURL <> $_SERVER['REQUEST_URI']) {
   header("Status: 301 Moved Permanently", false, 301);
   header("Location: http://www.monsite.com".$controlURL);
   exit;
}
 
Nouveau WRInaute
@Victor BRITO : même résultat :(
@webmasterlamogere : j'avais écrit ma condition ainsi au départ je ne l'ai décomposée que pour mes essais et les affichages de debug ;)


Je n'ai tjs pas trouvé une solution, ça fait presque 24h que je planche dessus, toutes mes autres réécritures fonctionnent à merveille, je sais plus quoi imaginer :'(
 
Nouveau WRInaute
Je viens de faire les tests voilà ce que ça donne :

Avec une adresse "valide" (le dernier paramètre peut aller de 0 à 3) (http-://www.monsite.com/Catalogue-2-LeNom-2.html)

Code:
HTTP/1.1 200 OK
Date: Fri, 16 Nov 2007 12:37:30 GMT
Server: [...]
X-Powered-By: PHP/4.4.2
Set-Cookie: PHPSESSID=bf7c866040b40f57042124cdf5fc
37a8; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
, post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Content-Type: text/html

Avec une adresse "invalide" (http-://www.monsite.com/Catalogue-2-LeNom-5.html)

Code:
HTTP/1.1 301 Moved Permanently
Date: Fri, 16 Nov 2007 12:39:51 GMT
Server: [...]
X-Powered-By: PHP/4.4.2
Location: http://www.monsite.com/Catalogue-2-LeNom-5.html?page=3
Set-Cookie: PHPSESSID=f47a656f2bf7888ae925728cda23
bf1e; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 0
Connection: close
Content-Type: text/html

LE truc bizarre, c'est qu'il rajoute automatiquement un paramètre "page" avec la valeur maximum possible... ce que je n'ai écrit nulle part!!

Mon code PHP :
Code:
if ((!isset($_GET['page'])) || ($_GET['page']>$HigherExistingPage || $_GET['page']<1) )
	$controlURL = "/Catalogue."-".$_GET['cat']."-".$nomcat.".html";
else
	$controlURL = "/Catalogue."-".$_GET['cat']."-".$nomcat."-".$_GET['page'].".html";

if ($controlURL!=$_SERVER['REQUEST_URI'])
{
	header("Status: 301 Moved Permanently", false, 301);
	header("Location: http://www.monsite.com".$controlURL);
}

Mon .htaccess :
Code:
RewriteRule ^Catalogue-([0-9]+)-([^-]+)\.html$ Catalogue.php?cat=$1&nomcat=$2 [NC,L]
RewriteRule ^Catalogue-([0-9]+)-([^-]+)-([0-9]+)\.html$ Catalogue.php?cat=$1&nomcat=$2&page=$3 [NC,L]
 
Nouveau WRInaute
C'était bien le exit(), je venais poster pour dire que j'avais trouvé ;)


Maintenant, reste à attendre patiemment les résultats (ou absence de résultats) côté référencement :)
 
Discussions similaires
Haut