Partage
  • Partager sur Facebook
  • Partager sur Twitter

Redirection 301 ou 404

    16 janvier 2024 à 20:05:40

    Bonsoir tout le monde,

    Dans la dernière version de mon site, j'ai mis en place un système de réécriture d'URL qui fonctionne très bien.  Par contre, dans ma Search Console, Google s'évertue à me trouver des URL qui n'existent pas... en me signalant qu'elles n'existent pas (Soft 404).

    Idéalement, mettre des 404 en remplacement, ce n'est pas top surtout que pour les Soft 404 la page existe bel et bien mais dans un autre répertoire.  Je cherche donc à mettre en place un système de redirection 301 mais aussi 404.

    Je vous explique un peu comment est agencé le site.  J'ai du contenu texte dans une base de données.  Pour faire simple: id, titre, date, texte, repertoire, dossier, urlwrittee. Le schéma de réécriture est le suivant mon-domaine.net/repertoire/dossier/urlwrittee.

    Le problème c'est que Google me détecte des "urlwritee" au bon endroit mais également ailleurs sur le site.  Par exemple, une bonne URL "mon-domaine.net/repertoire01/dossier01/titre-de-ma-page" peut être trouvée dans "mon-domaine.net/repertoire01/dossier08/titre-de-ma-page" avec comme contenu "0 résults".

    Ce "0 résults" vient d'une partie du code PHP de la page.  Et que j'ai remplacé pour faire la redirection 301 ou 404.

    <?php 
    		}
    } else {
        echo "0 results";
    }
    mysqli_close($conn);
    ?>


    J'ai cherché pas mal ces derniers jours à trouver une solution à ce problème parce que mon site compte + de 1800 textes et une 20aine de répertoires.  Autrement dit, autant d'URL susceptibles d'exister pour Google.

    J'ai trouvé pour remplacer le "0 resuts" par une redirection 404 et elle fonctionne.  Par contre, je me dis que c'est dommage de faire une redirection 404 pour une page détectée dans un répertoire autre que le bon.  Je pense qu'une redirection 301 serait plus adaptée dans ce cas.

    Et c'est à partir d'ici que je coince.  J'ai cherché ici et ailleurs, testé pas mal de choses, demandé de l'aide à ChatGPT (qui m'a bien aidé il faut l'avouer) mais malheureusement, je n'arrive pas à faire les redirections 301 avec des URL reconstruites.  Si je note la bonne URL dans le code, le 301 fonctionne mais si l'URL est reconstruite, j'ai une redirection vers la racine du site et avec cette URL affichée mon-domaine.net///

    Je suppose donc que repertoire/dossier/urlwrittee restent vides.

    Dans l'idéal absolu, j'aurais aimé parvenir à mettre en place un code qui

    - Si l'URL reconstruite est bonne -> affiche la page

    - Si urlwritee est bonne mais pas bon endroit -> redirection 301

    - Si urlwritee pas bonne -> redirection 404.

    voici mon code pour la redirection 301

    <?php
    ob_start();
    
    // Inclure le fichier de connexion
    include('connect.php');
    
    if (!isset($_GET['urlwrittee'])) {
        echo('<p>Requête invalide! Vous n\'êtes pas autorisé à lire cette page!</p>');
    } else {
        $urlwrittee = $_GET["urlwrittee"];
    
        // Exécuter la requête SQL
        $sql = "SELECT * FROM publications WHERE `repertoire` = 'accueil' AND urlwrittee='$urlwrittee'";
        $result = mysqli_query($conn, $sql);
    
        if (mysqli_num_rows($result) > 0) {
            // output data of each row
            while ($row = mysqli_fetch_assoc($result)) {
    ?>
    
    <!DOCTYPE html>
    
    </html>
    
    <?php
            }
        } else {
            // Rediriger si aucun résultat n'est trouvé
            mysqli_close($conn);
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: https://mon-domaine.net/{$row['repertoire']}/{$row['dossier']}/{$row['urlwrittee']}");
            exit; // Assurez-vous que le script s'arrête après la redirection
        }
        mysqli_close($conn);
    }
    
    ob_end_flush();
    ?>

    Je suis très loin d'être performant en PHP et ChatGPT m'aide bien pour un peu comprendre et tester des choses mais je n'arrive pas à faire en sorte que

    Si bonne URL -> page affichée

    Si uniquement bon urlwrittee -> redirection 301

    Si mauvais urlwrittee -> 404 (par exemple 1 caractère en + ou en - ou urlwrittee qui n'existe pas du tout).  Oui parce que dans les "Soft 404", j'ai des URL avec un caractère en moins ou en plus.  J'essaie de trouver une parade pour une bonne réponse à toutes ces pages.  Pour le moment, j'en ai 163 en Soft 404.

    La question que je me pose, c'est comment se fait-il que Google détecte des pages qui n'ont aucun lien pointant vers elles parce qu'elles n'existent pas.  Là, j'ai plein de pages ou le paramètre "urlwritee" est suivi de /1000.

    Je vous remercie pour toute l'aide que vous m'apporterez.

    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2024 à 21:03:30

      Bonjour, tout cela va se gérer depuis le fichier .htaccess ou depuis la configuration de ton server directement.

      Il faut que tu metre l'option [NC] => No Case, dans ton fichier .htaccess quand tu fais de l'url rewriting.

      Exemple :

      RewriteRule ^rewrite/$ /chemin/vers/ton/fichier [L,NC] # No Case

      Dans l'url si l'utilisateur met https://exemple.com/ReWritE/, et bien l'url va être réécris par le server en https://exemple.com/rewrite/.

      Voici un lien vers la conf apache2.4 qui t'expliquera tout ca en detaille : lien.

      Tu peut également faire une redirection de => http://exemple.com/chemin/vers/fichier.html , sur une url réécrite => http://exemple.com/rewrite/,  grâce à une redirection 301 géré depuis le fichier .htaccess.

      -
      Edité par Fc_fifou 30 janvier 2024 à 21:05:45

      • Partager sur Facebook
      • Partager sur Twitter
        30 janvier 2024 à 21:19:21

        > Il faut que tu metre l'option [NC]

        Ce n'est pas un problème de casse, en quoi [NC] va résoudre quoi que ce soit ici ?

        > ChatGPT

        mouais ...

        Bref, ça me paraît difficile de détecter que la ressource existe mais ailleurs (surtout s'il y a des conflits éventuels), le plus simple c'est d'indiquer que la page n'existe pas par un statut 404 comme ça aurait dû être initialement prévu (http_response_code(404);).

        PS : ça manque de logique/le code n'est pas terrible surtout que tu as des injections SQL !

        EDIT : si urlwrittee a bien une contrainte unique quand ton code avec sa boucle laisse supposer le contraire, le code devrait être le suivant :

        if ($row = mysqli_fetch_assoc($result)) {
            $expected_path = "/{$row['repertoire']}/{$row['dossier']}/{$row['urlwrittee']}";
            if ($_SERVER['REQUEST_URI'] == $expected_path) {
                // chemin correct : afficher la page
            } else {
                // chemin incorrect : redirection permanente
                header("HTTP/1.1 301 Moved Permanently");
                header('Location: ' . $expected_path);
                exit;
            }
        } else {
            // ça ne correspond à rien : 404
            http_response_code(404);
            exit;
        }
        

        EDIT² : selon :

        > header("Location: https://mon-domaine.net/{$row['repertoire']}/{$row['dossier']}/{$row['urlwrittee']}");

        Ce qui rend une URL unique c'est l'ensemble des colonnes repertoire + dossier + urlwrittee.

        • pourquoi repertoire a une valeur hardcodée dans ta requête ? (ça pue le script reproduit dans plusieurs répertoires)
        • pourquoi repertoire et dossier ne sont pas, au même titre que urlwrittee, également extraits de l'URL via réécriture pour être réinjectés en paramètres de query string/$_GET ?
        • tu es conscient qu'en l'état, à moins d'une contrainte unique sur urlwrittee ou repertoire + urlwrittee (et dans ce cas pourquoi dossier n'en fait pas partie ?), si jamais plusieurs dossiers ont une urlwrittee de même nom, tu (tes utilisateurs surtout) pourrais(ent) ne jamais être capable d'y accéder ?

        -
        Edité par julp 30 janvier 2024 à 23:00:23

        • Partager sur Facebook
        • Partager sur Twitter
          26 février 2024 à 19:39:30

          Hello,

          Je vais regarder de plus près ce que tu m'as expliqué.  J'avoue que je fais très peu de PHP et que chaque fois que je refais une nouvelle version du site, je dois tout réapprendre à partir de 0 parce que j'oublie avec les années.  C'est très fastidieux.  L'URL writting est en place depuis la dernière version du site et je n'avais pas encore eu le temps de regarder dans la GSC comment ça se passait.

          Je te rassure, je n'utilise pas les scripts générés par ChatGPT.  J'ai un répertoire pour tester ce qu'il me sort et je regarde sur les forums et autres pour essayer de comprendre et corriger.  Je ne fais pas du tout confiance au codage IA mais c'est une base comme une autre pour avancer.

          Pour les Soft404, j'ai compris l'origine de pas mal d'entre elles.  Certaines de ces pages inexistantes ont pour liens source des sites de pishing.  Je les ai bloqué avec htaccess.  Je vois qu'avec les semaines, le nombre de Soft404 est nette baisse.

          • Partager sur Facebook
          • Partager sur Twitter

          Redirection 301 ou 404

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown