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


Romanier
Auteur
Réponse acceptée

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!

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
Auteur

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');

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
Auteur

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

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
Auteur

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é).

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
Auteur
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; 
    }

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
Auteur

Résultat :
string(1) "/"

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
Auteur

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

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" !

Romanier
Auteur

string(39) "http://www.myahbox.fr/commandes/payment" /home/myahbox/www/core/Controller.php:105

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
Auteur

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

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
Auteur

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

Romanier
Auteur

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

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" !