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

Discussion dans 'Netlinking, backlinks, liens et redirections' créé par LordSuprachris, 14 Novembre 2007.

  1. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    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?
     
  2. HawkEye
    HawkEye WRInaute accro
    Inscrit:
    23 Février 2004
    Messages:
    13 857
    J'aime reçus:
    5
    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

    ;)
     
  3. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 647
    J'aime reçus:
    1
    +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.
     
  4. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    J'avais pas pensé à ça, ta solution marche nickel HawkEye, t'es 1 génie ^^

    Un grand merci :)
     
  5. HawkEye
    HawkEye WRInaute accro
    Inscrit:
    23 Février 2004
    Messages:
    13 857
    J'aime reçus:
    5
    Mais non, mais non...
    Juste un stressé de l'erreur 404 :lol:
     
  6. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    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:
     
  7. Victor BRITO
    Victor BRITO WRInaute occasionnel
    Inscrit:
    21 Décembre 2006
    Messages:
    332
    J'aime reçus:
    0
    Essaie en remplaçant les * par des +.
     
  8. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 647
    J'aime reçus:
    1
    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;
    } 
     
  9. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    @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 :'(
     
  10. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 647
    J'aime reçus:
    1
  11. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    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]
     
  12. webmasterlamogere
    webmasterlamogere WRInaute passionné
    Inscrit:
    17 Décembre 2006
    Messages:
    1 647
    J'aime reçus:
    1
    il manque "exit;" après "header("Location: http://www.monsite.com".$controlURL);"

    n'y a t'il pas une redirection 301 dans le htaccess qui traine (avec RewriteCond)?
     
  13. LordSuprachris
    LordSuprachris Nouveau WRInaute
    Inscrit:
    29 Août 2007
    Messages:
    32
    J'aime reçus:
    0
    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 :)
     
Chargement...
Similar Threads - foireuses rediriger problème Forum Date
Urls foireuses : redir or just ignore ? Netlinking, backlinks, liens et redirections 22 Septembre 2017
WordPress Rediriger le visiteur en fonction de la langue du navigateur Référencement international (langues, pays) Vendredi à 13:16
Supprimer landing page homepage, rediriger vers page réelle Problèmes de référencement spécifiques à vos sites 28 Novembre 2021
Rediriger seo d'un site vers un autre Débuter en référencement 4 Novembre 2021
Rediriger de non-www à www pour utiliser Cloudflare Référencement Google 1 Novembre 2021
Rediriger tout un site vers un répertoire à la racine URL Rewriting et .htaccess 23 Juin 2021
Rediriger des domaines au nom explicite vers un domaine établi mais moins spécifique Netlinking, backlinks, liens et redirections 1 Février 2021
page 404 lien indexer comment le rediriger? Débuter en référencement 12 Janvier 2021
rediriger les sous domaines vers la page d'accueil URL Rewriting et .htaccess 11 Janvier 2021
Domaines Expirés : rediriger ou faire des sites ? Netlinking, backlinks, liens et redirections 3 Décembre 2020
Comment rediriger en 301 toutes les 404 vers une page précise ? Débuter en référencement 9 Septembre 2020
Rediriger Index.php vers racine URL Rewriting et .htaccess 15 Août 2020
Tout rediriger sauf une page contenant 'JS' URL Rewriting et .htaccess 3 Juin 2020
Rediriger un site avec www vers sans www Administration d'un site Web 20 Avril 2020
Rediriger une page URL Rewriting et .htaccess 6 Avril 2020
Rediriger uniquement le dossier sans les pages internes Netlinking, backlinks, liens et redirections 17 Février 2020
Rediriger site dans un dossier à la racine Demandes d'avis et de conseils sur vos sites 14 Novembre 2019
Comment rediriger si la langue n'est plus dispo sur le nouveau site Référencement international (langues, pays) 27 Août 2019
Rediriger sujet phpBB3 vers Vanilla 3 URL Rewriting et .htaccess 6 Août 2019
Rediriger uniquement la page d'accueil URL Rewriting et .htaccess 5 Juin 2019