Bonjours, voila j'ai suivi le tuto de création d'un site de A à Z et aujourd'hui je me retrouve face à un gros problème.
J'ai décidé de le mettre en ligne et voilà que je rencontre un problème, dès que je clique sur un lien il me renvoi à la page d'accueil...
J'ai cherché sur le forum et j'ai tester les solution proposé mais malheureusement aucune ne fonctionne. Je suis vraiment coincé.

Est ce que quelqu'un pourrait m'aider s'il vous plaît?

PS : mon problème se trouve sur tout les liens, ils me redirigent tous vers ma pages d'accueil...

19 réponses


shinigami35
Auteur
Réponse acceptée

Je viens de réussir à corriger mon erreur de liens, En effet cela venait du faite que mon hébergeur dans sa façon de géré, mettait le PATH_INFO du Request vide, donc cela redirigeait tous mes liens vers ma page index, Le code du mon Request est donc :
<?php
class Request{

public $url; // URL appellé par l'utilisateur
    public $page = 1; // pour la pagination 
    public $prefix = false; // Prefixage des urls /prefix/url
    public $data = false; // Données envoyé dans le formulaire
    public function __construct(){
        //$this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/'; 
        $this->url = !empty($_SERVER'PATH_INFO']) ? $_SERVER'PATH_INFO'] : (!empty($_SERVER'ORIG_PATH_INFO']) ? $_SERVER'ORIG_PATH_INFO'] : '');

        // Si on a une page dans l'url on la rentre dans $this->page
        if(isset($_GET'page'])){
            if(is_numeric($_GET'page'])){
                if($_GET'page'] > 0){
                    $this->page = round($_GET'page']); 
                }
            }
        }
        // Si des données ont été postées ont les entre dans data
        if(!empty($_POST)){
            $this->data = new stdClass(); 
            foreach($_POST as $k=>$v){
                $this->data->$k=$v;
            }
        }
    }

}

Il suffit de changé la ligne :

$this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/';

Par :

$this->url = !empty($_SERVER'PATH_INFO']) ? $_SERVER'PATH_INFO'] : (!empty($_SERVER'ORIG_PATH_INFO']) ? $_SERVER'ORIG_PATH_INFO'] : '');

Espérons que cela serve à d'autres personnes.

Salut !

Clic droit afficher le code source de la page et copie colle tes <a href...> ainsi que ton code php pour tes lien du genre Router::url('...')

Ca permettra d'avoir une meilleure idée de ton problème ;)

Salut!

Vérifie aussi tes Router::connect(), voir si ta pas une erreur d'appel ou de redirection.

Edouard

Donc voici le code de mon router :

<?php
class Router{

    static $routes = array(); 
    static $prefixes = array(); 
    /**
    * Ajoute un prefix au Routing
    **/
    static function prefix($url,$prefix){
        self::$prefixes$url] = $prefix; 
    }

    /**
    * Permet de parser une url
    * @param $url Url à parser
    * @return tableau contenant les paramètres
    **/
    static function parse($url,$request){
        $url = trim($url,'/'); 
        if(empty($url)){
            $url = Router::$routes[0]'url']; 
        }else{
            $match = false; 
            foreach(Router::$routes as $v){
                if(!$match && preg_match($v'redirreg'],$url,$match)){
                    $url = $v'origin'];
                    foreach($match as $k=>$v){
                        $url = str_replace(':'.$k.':',$v,$url); 
                    } 
                    $match = true; 
                }
            }
        }

        $params = explode('/',$url);
        if(in_array($params[0],array_keys(self::$prefixes))){
            $request->prefix = self::$prefixes$params[0]];
            array_shift($params); 
        }
        $request->controller = $params[0];
        $request->action = isset($params[1]) ? $params[1] : 'index';
        foreach(self::$prefixes as $k=>$v){
            if(strpos($request->action,$v.'_') === 0){
                $request->prefix = $v;
                $request->action = str_replace($v.'_','',$request->action);  
            }
        }
        $request->params = array_slice($params,2);
        return true; 
    }

    /**
    * Permet de connecter une url à une action particulière
    **/
    static function connect($redir,$url){
        $r = array();
        $r'params'] = array();
        $r'url'] = $url;  
        $r'originreg'] = preg_replace('/([a-z0-9]+):(^\/]+)/','${1}:(?P<${1}>${2})',$url);
        $r'originreg'] = str_replace('/*','(?P<args>/?.*)',$r'originreg']);
        $r'originreg'] = '/^'.str_replace('/','\/',$r'originreg']).'$/'; 
        // MODIF
        $r'origin'] = preg_replace('/([a-z0-9]+):(^\/]+)/',':${1}:',$url);
        $r'origin'] = str_replace('/*',':args:',$r'origin']); 
        $params = explode('/',$url);
        foreach($params as $k=>$v){
            if(strpos($v,':')){
                $p = explode(':',$v);
                $r'params']$p[0]] = $p[1]; 
            }
        } 
        $r'redirreg'] = $redir;
        $r'redirreg'] = str_replace('/*','(?P<args>/?.*)',$r'redirreg']);
        foreach($r'params'] as $k=>$v){
            $r'redirreg'] = str_replace(":$k","(?P<$k>$v)",$r'redirreg']);
        }
        $r'redirreg'] = '/^'.str_replace('/','\/',$r'redirreg']).'$/';
        $r'redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
        $r'redir'] = str_replace('/*',':args:',$r'redir']); 
        self::$routes] = $r; 
    }
    /**
    * Permet de générer une url à partir d'une url originale
    * controller/action(/:param/:param/:param...)
    **/
    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; 
    }
}

la voici le lien de mon site : sweetridde.epimeros.org

Les liens sont de la sorte

<li><a href="/users/index">Connexion</a></li>

Pour le Router::connect c'est le même que le tuto.

Merci de votre aide :)

Salut, j'avais rencontré le même problème que toi, c'est ton hébergeur qui n'a pas tout les bons modules essai par exemple avec byethost.

Que veux tu dire par pas les bon modules? Lesquels ne sont pas activés?

EDIT : Je ne comprends toujours pas pourquoi cela ne fonctionne pas, j'ai tout fait comme dans le tuto mais sa bug, merci d'avance de votre aide.

Bonjour, je ne sais pas quels modules précisément, mais c'est un problème d’hébergeur j'ai moi même eu ce soucis

Non je viens de me demander à mon hébergeur et le module est bien activé. D'après lui l'erreur vient de mes paramètres pour l'url rewriting, mais je ne sais pas ce qu'il faut que je fasse dans mes fichier pour modifier cette erreur.

Merci de m'aider...

tu ne veut pas m'écouter ?? alors débrouille toi tout seul je t'ai donné la solution a ton problème, si tu n'en prend pas conte ferme le sujet .

Tu ne sais pas quoi mettre dans le .htaccess mais tu ne nous montres pas comment il est formé, comment veux-tu que l'on t'aides ?

donc voici mon arborescence,

.htaccess
-config
-controller
-core
-model
-view
-webroot
        --.htaccess

mon premier htaccess (qui est a la racine)

RewriteEngine On
RewriteRule (.*) webroot/$1 [L]

deuxième htaccess (dans le dossier webroot)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

Désolé, de ne pas l'avoir mis avant merci de votre aide d'avance

Tiens rajoutes ça au début de tes deux .htaccess:
Options +FollowSymLinks

Et dis moi si c'est réglé ^^ .

J'ai rajouter cela mais rien ne change...

Dans ton 1er .htaccess compose le comme ça:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule (.*) webroot/$1 [QSA,L]

Et le deuxième ainsi:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php [QSA,L]

Rien ne change, mes url sont bien structuré mais rien ne me renvoi vers leur page, et renvoient toutes vers ma page index...

Mais j'ai l'impression que cela vient d'autre part que de mes fichier .htaccess. J'ai aussi changé le code de mon router car il mettait une '/' en trop au départ de mes liens.

return BASE_URL.'/'.$url;

c'est devenu :

return BASE_URL.$url;

Mon problème peut il aussi venir de ce changement.

J'ai oublié le /$1 aprés index.php dans le deuxième je viens de tester sans en local et ça me met toujours la page d'accueil ^^ .

Sa me met toujours la page d'accueil, et je ne veux pas cela, je veux que tous mes liens me redirige vers leur pasge respective. Et je n'y arrive pas...

je ne sais pas quoi changer, si c'est dans mes .htaccess ou autre choses...

Tu es chez quel hébergeur ? Savoir s'il y a des régles particulières à mettre ou non dans les htaccess.
Au cas où fait nous voir ton Request qu'on puisse voir si c'est pas un problème de PATH_INFO.
Sinon voici ma class Router(je l'ai modifié quelques peu):

<?php
class Router{
        static $routes = array();
        static $prefixes = array();
        /**
        * Ajoute un prefix au Routing
        **/
        static function prefix($url,$prefix){
            self::$prefixes$url] = $prefix;
        }

        /**
        *Permet de parser une url
        *@param $url Url à parser
        *@return tableau contenant les paramètres
        **/
        static function parse($url,$request){
            $url = trim ($url,'/');
            if(empty($url)){
                $url = Router::$routes[0]'url'];
            }else{
                $match = false;
                 foreach(Router::$routes as $v){
                if(!$match && preg_match($v'redirreg'],$url,$match)){
                       $url = $v'origin'];
                       foreach($match as $k=>$v){
                        $url = str_replace(':'.$k.':',$v,$url);
                       }
                       $match = true;
                   }
                }
            }
            $params = explode('/',$url);
            if(in_array($params[0],array_keys(self::$prefixes))){
                $request->prefix = self::$prefixes$params[0]];
                array_shift($params);
                 }
            $request->controller= $params[0];
            $request->action= isset($params[1]) ? $params[1] : 'index';
            foreach(self::$prefixes as $k=>$v){
              if(strpos($request->action,$v.'_') === 0){
                $request->prefix = $v;
                $request->action = str_replace($v.'_','',$request->action);
              }
            }
            $request->params = array_slice($params,2);
            return true;
        }

        /**
        * Permet de connecter une url à une action particulière.
        **/
        static function connect($redir,$url){
             $r = array();
             $r'params'] = array();
             $r'url'] = $url;
             $r'originreg'] = preg_replace('/([a-z0-9]+):(^\/]+)/','${1}:(?P<${1}>${2})',$url);
             $r'originreg'] = str_replace('/*','(?<args>/?.*)',$r'originreg']);
             $r'originreg'] = '/^'.str_replace('/', '\/', $r'originreg']).'$/';
             //MODIF
             $r'origin'] = preg_replace('/([a-z0-9]+):(^\/]+)/',':${1}:',$url);
             $r'origin'] = str_replace('/*',':args:',$r'origin']);
             $params = explode('/',$url);
             foreach($params as $k=>$v){
                if(strpos($v,':')){
                 $p = explode(':',$v);
                 $r'params']$p[0]] = $p[1];
                }
            }
            $r'redirreg'] = $redir;
            $r'redirreg'] = str_replace('/*','(?<args>/?.*)',$r'redirreg']);
            foreach($r'params'] as $k=>$v){
                $r'redirreg'] = str_replace(":$k","(?P<$k>$v)",$r'redirreg']);
            }
            $r'redirreg'] = '/^'.str_replace('/', '\/', $r'redirreg']).'$/';
            $r'redir'] = preg_replace('/:([a-z0-9]+)/',':${1}:',$redir);
            $r'redir'] = str_replace('/*',':args:',$r'redir']);
            self::$routes] = $r;

        } 
        /**
        * Permet de générer une url à partir d'une url original
        * controller/action(/:param/:param/:param...)
        **/
        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 'http://'.$_SERVER'HTTP_HOST'].'/'.str_replace(" ","-",$url);
        }

        static function webroot($url){
            trim($url,'/');
            return 'http://'.$_SERVER'HTTP_HOST'].BASE_URL.$url;
        }
}
?>

Je viens de tester avec ton router, mais rien ne change ...

Voici mon Request :

<?php
class Request{

    public $url; // URL appellé par l'utilisateur
    public $page = 1; // pour la pagination 
    public $prefix = false; // Prefixage des urls /prefix/url
    public $data = false; // Données envoyé dans le formulaire
    public function __construct(){
        $this->url = isset($_SERVER'PATH_INFO'])?$_SERVER'PATH_INFO']:'/'; 
        // Si on a une page dans l'url on la rentre dans $this->page
        if(isset($_GET'page'])){
            if(is_numeric($_GET'page'])){
                if($_GET'page'] > 0){
                    $this->page = round($_GET'page']); 
                }
            }
        }
        // Si des données ont été postées ont les entre dans data
        if(!empty($_POST)){
            $this->data = new stdClass(); 
            foreach($_POST as $k=>$v){
                $this->data->$k=$v;
            }
        }
    }

}