Mes redirections ne s’exécutent pas en ligne

Par Romanier, il y a 11 ans


Bonjour à tous,
J'ai développé un site sur la base d'un modèle MVC grâce aux tutos "Développer un site de A à Z".
Mon site marche très bien en local.
Lorsque que je le met en ligne, tout semble fonctionner excepté les redirections exécutés dans mes fonctions.
$this->redirect('') semble ne pas s’exécuter en ligne.

Impossible de trouver la solution qui correspond à mon MVC.
Merci pour votre aide.

21 réponses

Glaived, il y a 11 ans

alors, normalement ta fonction si tu la pas modif' c'est:

function redirect($url,$code = null ){
        if($code == 301){
            header("HTTP/1.1 301 Moved Permanently");
        }
        header("Location: ".Router::url($url)); 
    }

et la fonction url:

static function url($url = ''){
        trim($url,'/'); 
        foreach(self::$routes as $v){
            if(preg_match($v'originreg'],$url,$match)){
                $url = $v'redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url); 
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url); 
            }
        }
        return BASE_URL.'/'.$url; 
    }

dans un premier temps, fait un var_dump de Router::url($url) dans redirect comme ci dessous:

function redirect($url,$code = null ){
        if($code == 301){
            header("HTTP/1.1 301 Moved Permanently");
        }
        var_dump( Router::url($url) ); die( __FILE__.':'. __LINE__ ); //
        header("Location: ".Router::url($url));
    }

et dit nous ce que ça te retourne


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Merci de m'aider.
Le var_dump me retourne ceci :
string(16) "/commandes/index" /home/myahbox/www/core/Controller.php:105

Ma redirection est : $this->redirect('commandes/index');

Glaived, il y a 11 ans

Hmm, comportement normal, peu etre que ça viens de la configuration php ?

En dehors de ton MVC, test dans deux fichiers, ces lignes suivantes:

<?php
// File1.php
header('Location: http://www.grafikart.fr/forum/topic/13402');

<?php
// File2.php
header('Location: /test/url/relative');

« HTTP/1.1 demande une URI absolue comme argument de » Location:, y compris le protocole, hôte et chemin absolu. » Cf : http://www.php.net/manual/fr/function.header.php


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Le fichier 1 marche mais pas le 2.
Si c'est un problème de configuration php, il faudrait que je modifie quoi?
Merci

Glaived, il y a 11 ans

Tu voudrais redirigé vers quel addresse ? c'est $this->redirect() que tu fais ?


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

En fait j'ai une fonction qui traite un formulaire. Tout simple.
Je veux que si l'utilisateur a posté toutes les données, il soit redirigé sur une nouvelle page.
donc
$this->redirect('commandes/index');
}else{
$this->Session->setFlash('Merci de corriger vos informations','error');
}

Exactement comme sur le tuto en fait.
Ca marche très bien en local (wamp) mais en ligne avec OVH, la redirection ne marche pas. Je reste sur ma page de formulaire (mais la fonction est traité).

Glaived, il y a 11 ans

tu peu montrer ta fonction url() de Router.php ?


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans
static function url($url = ''){
        trim($url,'/'); 
        foreach(self::$routes as $v){
            if(preg_match($v'originreg'],$url,$match)){
                $url = $v'redir']; 
                foreach($match as $k=>$w){
                    $url = str_replace(":$k:",$w,$url); 
                }
            }
        }
        foreach(self::$prefixes as $k=>$v){
            if(strpos($url,$v) === 0){
                $url = str_replace($v,$k,$url); 
            }
        }
        return BASE_URL.'/'.$url; 
    }
    static function webroot($url){
        trim($url,'/');
        return BASE_URL.'/'.$url; 
    }
Glaived, il y a 11 ans

Fait un var_dump(BASE_URL); n'importe ou, genre dans l'index avant new Dispatcher; ^^


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Résultat :
string(1) "/"

Glaived, il y a 11 ans

remplace ta fonction redirect par:

function redirect($url, $code=null){
    if($code == 301) header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://'.$_SERVER'HTTP_HOST'].Router::url($url));
}

normalement ça devrais être bon en local+online


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Malheureusement c'est la même chose.
Ok en local mais la redirection ne s’exécute pas online...

Glaived, il y a 11 ans
function redirect($url, $code=null){
    if($code == 301) header('HTTP/1.1 301 Moved Permanently');
    $url = 'http://'.$_SERVER'HTTP_HOST'].Router::url($url);
    var_dump( $url ); die( __FILE__.':'. __LINE__ ); //
    header('Location: '.$url);
}

Quel est la valeur de $url ? c'est peu être un probleme de config apache / php


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Glaived, il y a 11 ans

ok l'url est correcte, c'est quoi la config de ta vhost sur ton serveur ?


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Dans quel fichier je trouve ça?
Un fichier OVH je suppose?

Glaived, il y a 11 ans

Aucune idée, cherche à savoir quel est la configuration de la vhost sur ton offre OVH, je suis pas sûr que ça puisse venir de là, mais bon. Aussi, cherche le fichier d'erreur php ET apache, et vois ce que retourne les dernières lignes de ces fichier (montre les nous au passage)


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !

Romanier, il y a 11 ans

Désolé mais je comprends pas comment trouver ces fichiers d'erreur...

Romanier, il y a 11 ans

Je viens de récupérer ça en passant le fichier ovhconfig en development au lieu de production :
Warning: Cannot modify header information - headers already sent by (output started at /home/myahbox/www/config/hook.php:10) in /home/myahbox/www/core/Controller.php on line 106

Romanier, il y a 11 ans

Ca maaaaaarche!
La blague, il suffisait d'enlever le saut de ligne entre les deux fonctions...

<?php
if($this->request->prefix == 'admin'){
    $this->layout = 'admin'; 
    if(!$this->Session->isLogged() || $this->Session->user('role') != 'admin'){
        $this->redirect('users/login'); 
    }
}
?>
<?php
if($this->request->prefix == 'membre'){
    $this->layout = 'default'; 
    if(!$this->Session->isLogged() || $this->Session->user('role') != 'user'){
        $this->redirect('users/login'); 
    }
}
?>

Je te remercie beaucoup pour ton temps et ta patience!

Glaived, il y a 11 ans

Quel est la date et heure de cette erreur ?
Elle est du au faite que tu souhaite utilisé header() alors que tu a écris du code html avant, ou alors à un problème d'encodage (mes l'encodage de tes fichier php en utf8)


Si ton sujet est résolu, n’oublie pas de cliquer sur " Valider cette réponse" !