Bonjour à tous,
Apres avoir heuberger mon site web j'ai recontré un petit souci avec mes liens :
la redirection des pages avec le HEADER( LOCATION ) affiche une pages blanche.
voici par exemple un morceau de mon code qui mene à la page index de l'administrateur

              if( $_SESSION['Auth']['role'] == 'admin'){
                header('location:admin/index');
                 die(); 
             }

Alors qu'en Localhost ca marche parfaitement mais en ligne ca conduit à une page blanche.
Votre aide SVP

23 réponses


Mn0073RF
Auteur
Réponse acceptée

Merci beaucoup Lartak, merci mdsv41, c'est grace à vos réactions que je viens d'avoir une solution à mon probleme, j'ai suivi minutieusement nos échanges et decouvert que j'avais laissé du code HTML dans mon controlleur index juste avant le header or avant un header, il ne doit pas y avoir de code HTML envoyé (ni espace, ni passage à la ligne).
et voilà ca y est, ca marche tres bien merci encore à vous pour votre aide.

Bonjour.
Est-ce que tu as pensé que les deux environnements pouvaient être différents, soit la configuration par exemple, comme la version de PHP et la configuration du fichier php.ini ?
Si ton serveur de production (soit en ligne) n'affiche pas les erreurs PHP, il est normal que tu aies une page blanche.
À savoir que pour le header, ce n'est pas location mais Location.
Dans tous les cas, le peu de code et le peu de précision que tu nous montre ne nous permettra pas de t'aider, il te faut donc déja vérifier les points dont je t'ai parlé et nous apporter plus de précisions entre les deux environnements.
Sans oublier que lorsque tu fais ta redirection, si tu ne commences pas l'url avec un slash, la redirection sera faite à partir de l'url déjà présente, donc si par exemple l'utilisateur se trouve à l'url http://tonsite.com/login, il sera redirigé vers http://tonsite.com/loginadmin/index, ce qui provoquera à coup sùr une erreur, donc si tu dois faire une redirection à partir de la racine du site, je te conseille fortement de débuter l'url de redirection par un slash, soit par exemple :

header('Location: /admin/index');
Mn0073RF
Auteur

Bon apres midi mes freres
Merci pour vos interventions et desolé pour ce delai de reponse,
au faite je viens d'essayer avec toutes les methodes proposées sans succées; pour le PHP j'utilise la derniere version de wampServer qui fourni les versions PHP 5.6.31, 7.0.23 et 7.1.9 mon herbergeur à la Version: 7.0.26, croyez vous que ca peut aussi provoquer de incoherences des liens en ligne?

Est-ce que tu as vérifié si l'affichage des erreurs est activée sur ton hébergèment ?
Si oui, qiel est le niveau d'affichage ?
Car qui dit page blanche, dit que tu as des erreurs PHP et que le niveau de l'affichage n'est pas assez élevée pour celles-ci.
Si tu as accés au logs d'erreurs sur ton hébergement, il te faut les consulter, soit via SSH ou FTP.
Si tu ne peux pas faire ça, je vois mal comment nous pourrons t'aider, car nous n'allons pas attendre que tu partages le code entier de ton application WEB afin de pouvoir trouver où se trouve tes erreurs.
Par contre, tu ne nous a pas dit si tu as la page blanche sur n'importe quelle page où tu vas ou si ce n'est que pour quelques-unes.

Mn0073RF
Auteur

Pour les slash devant l'url cela ne pose aucun probleme, le lien garde ca syntax, j'ai declaré une variable WEBROOT que j'utilise pour toute redirection à partir de la racine,

    define('WEBROOT','/');

en plus j'ai essayer d'ameliorer le code comme suite:

 if( $_SESSION['Auth']['role'] == 'admin'){
                     header('Location:' .WEBROOT. 'admin/index');
                 die(); 
             }

Ca ne marche pas toujours mais ajoute juste un # à la fin de l'URL de ma page login, vous pouvez trouvez le squelette du site sur ce lien: https://webhostapp.com
voici le code source de ma page login:

if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
    $username = $_POST['username'];
    $req = $db->prepare("SELECT * from users WHERE (username  = :username OR email = :username) AND confirm_at IS NOT NULL ");
    $req->execute(['username' => $_POST['username']]);
    $user = $req->fetch(); 
    if(password_verify($_POST['password'],$user['password'])){
        $_SESSION['Auth']= $user;
        $user_id = $_SESSION['Auth']['id']; /***********user id******************/
        /********VERIFICATION REMEMBER ME*****************/
        if($_POST['remember']){
        $remember_token = str_random(250);
        $req = $db->prepare("UPDATE users SET remember_token = ? WHERE id = ?");
        $req->execute([$remember_token, $user['id']]);
        //$user = $req->fetch();
        setcookie('remember', $user['id']. '==' . $remember_token . sha1($user['id'] .'ratonlaveurs'), time() + 100 + 100 + 24 + 7);
        }   
        /********FIN VERIFICATION REMEMBER ME*****************/

             if( $_SESSION['Auth']['role'] == 'Mn0073RF'){
                $_SESSION['flash']['success']="Connecté";
                 header('Location:' .WEBROOT. 'admin/index');
                 die(); 
             }
             else  if( $_SESSION['Auth']['role'] == 'user'){
                 $_SESSION['flash']['success']="Connecté";
                  $_SESSION['infor']['info']=("Bienvenue $username sur votre espace de travail");

                   header('Location:' .WEBROOT. 'users/index');
                 die();
             }
             else{
                 $_SESSION['flash']['danger']="Mot de passe ou nom d'utilisateur incorrecte";
                 header('Location:' .WEBROOT. 'login');
                 die(); 
             }

    }else{
        $_SESSION['flash']['danger']="Identifiant ou mot de passe incorrect";
        //setFlash('mot de passe ou nom d utilisateur incorrecte');
    }

}
else{
        $_SESSION['flash']['danger']="Un champ est vide";
    }

Mais toujours en ligne quand j'assaie de changer directement l'url comme suite: https://webhostapp.com/users/index,
ca marche impeccablement
Merci encore

Pourrais-tu expliquer pourquoi dans le code suivant la chaîne de caractères est entre paranthèses ?

$_SESSION['infor']['info'] = ("Bienvenue $username sur votre espace de travail");

Ce n'est pas à ma connaissance une syntaxe valide.
Et puis, quel est l'intérêt de créer une constante juste pour un slash ?
Créer une constante par exemple :

define('DS', DIRECTORY_SEPARATOR);

Peut-être utile dans le sens où en premier lieu ça raccourci le nombre de caractères de la constante de base et que cette constante est utile car selon l'environnement sur lequel tourne le serveur la valeur peut être un slash ou un anti-slash, alors qu'avec ta constante tu ne fais que rallonger le nombre de caractères de ton code.
Par contre, est-ce qu'il y a une inclusion de fichier ou autre chose avant le code de ta page login ?
Car je vois que tu utilises la variable $_SESSION, mais je ne vois à aucun moment la vérification de l'objet session afin de l'initialiser ou non.

Mn0073RF
Auteur

Merci encore pour votre réaction Lartak apres verifications je ne sais pas comment voir les erruers chez mon heubergeur. Pour les pages c'est seulement celles qui redirigent vers les autres par example de la page login à la page index, de logout à index de verification à index,
utilisant bien sur le HEADER LOCATION pour la redirection, pour plus des details veuillez voir sont comportement sur cettensqueltte ici https://webhostapp.com
juste creer un compte et essayer de vous y connecté apres confirmation bien sur de votre compte. Merci

Bonjour,

Ce que je fais quand je developpe en php je creer un fichier erreur.php que que j'include dans chaque fichier.

<?php
// Afficher les erreurs à l'écran
ini_set('display_errors', 1);
// Enregistrer les erreurs dans un fichier de log
ini_set('log_errors', 1);
// Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
// Afficher les erreurs et les avertissements
error_reporting(e_all);
?>

Cela permet d'activé l'affichage des erreurs à l'écran.
Ce fichier, je le supprime lorsque que je le met en production.

Mdsv41

Mn0073RF
Auteur

Je viens de la remplacé par le slash ou la variable DS rien toujours
oui voici les codes qui vient en haut de ma page login:

<?php 
$auth =0 ;
 include"compt/inclusions.php" ;
reconnect_from_coockie(); 
if(isset($_SESSION['Auth'])){
    if( $_SESSION['Auth']['role'] == 'Mn0073RF'){
                 $_SESSION['flash']['success']="Connecté";
                 header('Location:' .WEBROOT. 'admin/index.php');
                 die(); 
             }
             else  if( $_SESSION['Auth']['role'] == 'user'){
                 $_SESSION['flash']['success']="Connecté";
                $_SESSION['infor']['info']= "Bienvenue $username sur votre espace de travail";

                header('Location:' .WEBROOT. 'users/index');
                 die();
             }
             else{
                // $_SESSION['flash']['danger']="Mot de passe ou nom d'utilisateur incorrecte";
                  header('Location:' .WEBROOT. 'users/index');
                 die();
             }

    /**************************************************
    ****************************************************************/ 
    if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
    $username = $_POST['username'];
    $req = $db->prepare("SELECT * from users WHERE (username  = :username OR email = :username) AND confirm_at IS NOT NULL ");
    $req->execute(['username' => $_POST['username']]);

Alors un autre soucis avec header, de mémoire, il ne faut pas que tu affiche quelques choses avant dans ta page.

Pour eviter ce soucis j'utilise un script JS

<script type='text/javascript'> document.location.replace('/users/index.php'); </script>

Cordialement
MDSv41

Ps: j'espere pas dir de betise

Dans ton code, tu as une vérification importante qui manque.
Tu fais une requête SQL et tu utilises directement son résultat if(password_verify($_POST['password'],$user['password'])){ sans même vérifier si tu en récupère un.
Tu devrais au minimum remplacer ce code par :

if ($user && password_verify($_POST['password'],$user['password'])) {

juste creer un compte et essayer de vous y connecté apres confirmation bien sur de votre compte. Merci

Non, je ne vais pas m'inscrire à un site juste pour essayer de trouver un problème, surtout que si aucune erreur s'affiche, ça ne m'y aidera en rien.
La seule chose que je pourrais voir en le faisant, c'est le code de statut HTTP dans l'onglet réseau des Outils de développement du navigateur, un peu comme si on se rend à la page de Mot de passe oublié?.

404. That’s an error.

The requested URL was not found on this server.

Je ne vois vraiment pas ce que je peux tirer de ce genre de retour.

Alors un autre soucis avec header, de mémoire, il ne faut pas que tu affiche quelques choses avant dans ta page.

S'il répondait à un maximum de mes questions et que son problème peut venir de là, j'aurais peut-être pu l'aider à résoudre son problème ou du moins une partie.

Pour eviter ce soucis j'utilise un script JS

Non, ta méthode n'est abolument pas une solution, celle-ci était peut-être utile lorsque le WEB était quasiment totalement statique, voir peut-être même la seule, mais ce n'est rien de plus que ce que j'appelle du bidouillage.

Ce que je fais quand je developpe en php je creer un fichier erreur.php que que j'include dans chaque fichier.

Tu devrais un peux mieux lire son problème, le suen n'est pas dans la partie dev, mais prod, ça ne va donc pas l'aider.

oui voici les codes qui vient en haut de ma page login:

C'est bien de rajouter du code, mais si on doit remonter d'inclusion en inclusion, ça va être long.
En tout vas pour l'instant je ne vois toujours pas de vérification et d'initialisation de la session.

Je viens de la remplacé par le slash ou la variable DS rien toujours

Si par DS tu veux dire pour le caractère de séparation de dossier _(DIRECTORY_SEPARATOR)_, ça ne t'aidera en aucun cas pour tes redirections, puisque il n'a aucun rapport avec les URL et su même en préfixant l'url avec un slash tu as toujours le problème avec les redirections, c'est que ton problème ne vient pas de la fonction header.

Mn0073RF
Auteur

Merci bien mdsv41 quand j'essai de remplacer ce code j'ai ce message d'erreur Cette page ne fonctionne pas!!
et quand j'inclu le fichier errors. php voici ce que j'ai dans mon fichier log_error_php.txt

**[26-Jun-2018 12:41:50 UTC] PHP Notice: Use of undefined constant e_all - assumed 'e_all' in C:\wamp\www\essai\login.php on line 84
[26-Jun-2018 12:41:50 UTC] PHP Stack trace:
[26-Jun-2018 12:41:50 UTC] PHP 1. {main}() C:\wamp\www\essai\login.php:0

Quel est le contenue de la ligne 84 de ton fichier C:\wamp\www\essai\login.php ?

Pour commencer en attendant la ligne 84

dans mon fichier erreur.php il y a une erreur

error_reporting(e_all);

e_all doit etre en majuscule donc E_ALL

Non mais, je parle pour rien ou quoi ?
L'histoire du fichier d'erreur ne résoudra en rien le problème, le problème se situe en phase de prod alors que cette solution est pour la phase de dev.
Pour rappel :

Apres avoir heuberger mon site web j'ai recontré un petit souci avec mes liens
Alors qu'en Localhost ca marche parfaitement mais en ligne ca conduit à une page blanche.

Mn0073RF
Auteur

Si par DS tu veux dire pour le caractère de séparation de dossier (DIRECTORY_SEPARATOR), ça ne t'aidera en aucun cas pour tes redirections, puisque il n'a aucun rapport avec les URL et su même en préfixant l'url avec un slash tu as toujours le problème avec les redirections, c'est que ton problème ne vient pas de la fonction header.

Merci Lartak, si ca ne vient pas de la fonction Header alors moi ce que je n'arrive vraiment pas à comprendre ce que tous ce codes sans ajout passent parfaitement meme la redirection sans probleme en Localhost, donc en local le site est deja finis , le probleme se pose quand c'est en ligne.

Oups je viens de relire ton post et effectivement mon code est a utiliser en face dev.
Mais a ma décharge (oui je sais je sort le parapluie, et le ciré) le gris claire utilisé pour reprendre un morceau de mon poste n'est pas des plus visible.
Attention Lartak, c'est pas un reproche, c'est juste un constat sur mon écran qui n'est plus tous jeune.
Sinon juste une question, le script que je donne pour rediriger n'est pas la meilleur solution, la il y a pas de soucis, mais si tu pouvais nous donner des pistes sur la moins mauvaise méthode pour la redirection, je suis preneur et je t'en remerci d'avance.

Mdsv41 (débutant PHP mais pas que...)

Mn0073RF
Auteur

Pour commencer en attendant la ligne 84
dans mon fichier erreur.php il y a une erreur

error_reporting(e_all);

oui c'est bien meme ca l'eurreur donc en la corrigeant le fichier est vide sans erreur.

As-tu essayé d'afficher ta page en tapant le lien direct dans un explorateur web ?
ex: www.toto.toto/admin/index.php
en ramplacant www.toto.toto par le nom de serveur distant.

le gris claire utilisé pour reprendre un morceau de mon poste n'est pas des plus visible.

Ce n'est pas moi qui choisi la couleur, c'est la couleur de rendu de la balise quote.

mais si tu pouvais nous donner des pistes sur la moins mauvaise méthode pour la redirection, je suis preneur et je t'en remerci d'avance.

Comme je l'ai dit dans mon message précédent mon précédent, son problème aurait peut-être déjà pu être résolu, s'il prenait en compte ce que je lui dit dans mes messages et pas juste les survoler à moitié.
Si ça continue, je vais laisser tomber, déjà que je suis légèrement énervé à cause de mon clavier, si en plus ce que je lui tapes dans mes messages sert à moitié à rien, je ne prendrais plus la peine de lui répondre.

Mn0073RF
Auteur

As-tu essayé d'afficher ta page en tapant le lien direct dans un explorateur web ?
ex: www.toto.toto/admin/index.php
en ramplacant www.toto.toto par le nom de serveur distant.

Oui en tapant directement le lien comme ceci: : https://webhostapp.com/users/index, la page est appellée et ca marche parfaitement pas de soucie

Mn0073RF
Auteur

Comme je l'ai dit dans mon message précédent mon précédent, son problème aurait peut-être déjà pu être résolu, s'il prenait en compte ce que je lui dit dans mes messages et pas juste les survoler à moitié.
Si ça continue, je vais laisser tomber, déjà que je suis légèrement énervé à cause de mon clavier, si en plus ce que je lui tapes dans mes messages sert à moitié à rien, je ne prendrais plus la peine de lui répondre.

Suis désolé Lartak si j'ai fais recours au furum c'est que j'ai echoué de moi meme et pendans plusieurs jours, je veux passé cette étape car c'est la derniere etape de mon site web, c'est pas juste venir gaspiller votre temps sur le furum ou avoir le plaisir de poster aussi un sujet, je le fais quand suis totalement depourvu et apres plusieurs esssaies, alors je tiens vraiment à un finir, si vous remarqué que je met un peux longtemps pour réajir à vos messages c'est psk je les test en profondeur et les applique car c'est bien moi qui suis dans le besoin, à quoi bon survoler comme tu l'as dis, pour ton info je n'ai sauté aucune de tes réactions sans annalyser profondement et essayer car j'y voyais deja un piste!!!

Je n'ai pas dit le contraire, par contre ce serait quand même normal que tu prennes en compte ce qui t'ai dit, qie si on te pose une question que tu y réponde et que tu donnes un retour.
Surtout que je te laisse le temps de lire mes messages vu que j'attends que tu y réponde.

pour ton info je n'ai sauté aucune de tes réactions sans annalyser profondement et essayer car j'y voyais deja un piste!!!

Dans ce cas là pourquoi tu n'en fais pas un retour ?
Je ne suis pas censé deviner ce que tu as fait ou non.
Ce n'est quand même pas compliqué un retour du genre :
J'ai fait ça, résultat ...., j'ai fait ..., résultat ...., j'ai fait ..., résultat ...
Comment peut'on savoir si une proposition que l'on te fait à un impact ou non sur le problème, par conséquent avoir une avancée si on ne sait pas ce que tu as fait et ce que tu as obtenu ?
C'est comme-ci quelqu'un te contacte par téléphone pour te demander de l'aide, que tu lui dit ce qu'il peut essayer de faire, qu'il te répond ok à chaque stade de ton explications, 5 minutes plus tard tu lui demandes où il en est et qu'il te répond qu'il n'a pas encore essayé.
Tu n'aurais pas l'impression qu'il n'en a rien à faire alors que c'est lui le plus concerné et que du coup tu as attendu 5 minutes pour rien ?