[RESOLU] Rediriger une page $_GET réécrite

Eléphant du PHP | 69 Messages

09 mars 2019, 17:02

Bonjour amis codeurs 8-)

J'ai besoin d'un petit coup de pouce pour rediriger une page à la base $_GET réécrite.
Comme un dessin vaux mieux qu'un long discours.

Prenons comme exemple ma page contact :

Son lien : http://monsite.fr/contact
Elle est réécrite comme cela :
RewriteRule ^([a-z-]*)$ index?page=$1 [L]
Donc si je tape dans mon navigateur : http://monsite.fr/index?page=contact sa fonctionne aussi.

Et je cherche donc à ce que quand je tape : http://monsite.fr/index?page=contact je sois rediriger sur ma page erreur

J'ai écris cela mais sa fonctionne pas
Redirect /index?page=$1 /erreur
Je rappel que ma page erreur est réécrite aussi.

Si quelqu'un à une astuce,
Merci d'avance.

Mammouth du PHP | 1967 Messages

09 mars 2019, 23:35

avec cette règle tu crée une boucle infinie de redirection.

l'idée est de faire une redirection en php si l'url ne te convient pas. donc dans le code de ta page index, tu peux détecter grace aux variables $_SERVER si tu est sur l'url réécrite ou non si non tu redirige avec header() vers l'url réécrite ou vers ta page erreur si tu veux mais je prefère la première option
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 69 Messages

12 mars 2019, 12:12

Oui j'y est pensé mais le problème c'est pour les pages qui n'existent pas.
Comment rediriger vers la page erreur pour une page qui n'existent ?

Avatar du membre
Mammouth du PHP | 1609 Messages

12 mars 2019, 12:37

Salut,

A la base l'erreur 404 est automatique. Si le fichier n'existe pas, le serveur web retourne une 404.

Mais dans ce cas, étant donné que tu utilises ce que l'on pourrait appeler un contrôleur principal (index) vers lequel tu rediriges toutes les adresses [a-z-]*, c'est dans ce contrôleur que tu dois gérer l'erreur 404.

Tu pourrais par exemple maintenir un tableau des valeurs de $_GET['page'] connues.
Et si la valeur de page est inconnue, tu envoies un header 404 (copier depuis la doc php header) suivi d'un exit :
if (!in_array($_GET['page'], array('page1', 'page2'))) {
  header("HTTP/1.0 404 Not Found");
  exit ;
}

PS : en admettant que tu ais une page 404.html tu pourrais remplacer le header par celui ci :
header('Location: http://ton.nom.de.domaine/404.html', true, 404);

Ou alors tu pourrais charger ou afficher le contenu de la page 404 afin que ce soit bien l'adresse en 404 qui s'affiche comme 404 :
if (!in_array($_GET['page'], array('page1', 'page2'))) {
  header("HTTP/1.0 404 Not Found");
  echo file_get_contents('404.html');
  exit ;
}
// OU
if (!in_array($_GET['page'], array('page1', 'page2'))) {
  header("HTTP/1.0 404 Not Found");
  echo 'Page not found!';
  exit ;
}
Développeur web depuis + de 20 ans

Eléphant du PHP | 69 Messages

12 mars 2019, 14:35

L'idée me plaît Saian.
Mais dans ton cas le visiteur pourra quand même avoir accès à la page via : www.monsite.fr/index?page=contact non ?
C'est ce que je veux éviter :)

Avatar du membre
Mammouth du PHP | 1609 Messages

12 mars 2019, 15:20

C'est bien la page index qui va s'exécuter, mais $_GET['page'] n'étant égal ni à page1 ni à page2, le script va rentrer dans le if et retourner la 404. Le tableau doit contenir les valeurs connues (autorisées) de page. Il y a un not (!) devant le in_array (si la valeur de $_GET['page'] n'est pas dans les valeurs du tableau).
Développeur web depuis + de 20 ans

Mammouth du PHP | 1967 Messages

12 mars 2019, 15:56

Il faut combiner les 2 concepts dans ta page index.php.

si tu ne veux pas utiliser un tableaux des pages authorisée, tu peux aussi faire un test sur l'existence de la page à inclure.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 69 Messages

12 mars 2019, 16:45

Alors,

Rediriger les visiteurs sur une page erreur si la page existe pas j'y arrive pas de soucis.
Je cherche juste que les anciens liens ne soit pas consultables. (En gros en passant par $_GET)

J'ai tenté ton astuce Saian, elle est cool mais en écrivant le lien par $_GET sa fonctionne aussi :(

Je vérifie déjà l'existence de la page pas de soucis.
Je tourne un peu en rond si vous avez un morceau de code pour m'éclairait..

Avatar du membre
Mammouth du PHP | 1609 Messages

12 mars 2019, 18:29

Ok je crois que je viens de comprendre ton problème. Désolé j'avais lu un peu trop vite ton message.

En fait la page contact existe donc l'adresse /contact affiche bien une page contact, mais tu veux que l'adresse originale index?page=contact retourne une erreur.

Dans ce cas, comme suggère Spols en combinant les 2 concepts.
Tu devrais pouvoir te baser sur $_SERVER['REQUEST_URI'] qui devrait retourner /contact ou /index?page=contact selon l'adresse saisie.
Tu pourrais donc tester cette variable pour savoir si tu es en présence de l'adresse originale et afficher une page d'erreur dans ce cas (par exemple tester que REQUEST_URI contient index?page=).
if (strpos($_SERVER['REQUEST_URI'], 'index?page=') !== false) {
  header('Location: http://ton.nom.de.domaine/erreur', true, 404);
  exit ;
}

Sachant que personnellement j'aurai plutôt tendance à injecter le contenu de la page d'erreur plutôt que de faire une redirection, contrairement à l'exemple de code que j'ai mis, car il me parait plus logique que ce soit l'adresse indésirée qui s'affiche en 404.
Donc je partirais plutôt sur un :
if (strpos($_SERVER['REQUEST_URI'], 'index?page=') !== false) {
  header("HTTP/1.0 404 Not Found");
  echo file_get_contents('la-page-d-erreur.html');
  exit ;
}
Développeur web depuis + de 20 ans

Eléphant du PHP | 69 Messages

12 mars 2019, 21:36

Bon bha je revenai pour dire que j'avais trouvé.
J'inscris pas mon code il est semblable au tiens.

En tout cas merci pour les infos !