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.
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.
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;
}
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 ?
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.
Redirection 301 ou 404
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli