Bonjour à tous,
J'ai suivi tout le tuto pour créer un site de A à Z et tout marche en local.
J'ai personnaliser comme je le voulais pour le moment même si j'ai encore quelques petites idées pour la suite...
J'ai donc décidé de l'héberger sur internet pour voir le rendu mais mon problème arrive à ce point.
Maintenant lorsque je veux changer de page, ben ça marche pas.
Vous pouvez le voir par vous même ICI
Au début j'avais quelques petites erreurs que j'ai corrigé mais là je bloque depuis deux jours...
Sur les liens du menu ça m'emmène sur des erreurs, et les liens en bas de page me redirige sur la page d'accueil à chaque fois.
J'ai pourtant rien changer par rapport à mes fichiers en local ni même à mes dossiers. :/
Si quelqu'un pouvais me faire avancer ça serait sympa.

Merci

30 réponses


Le soucis, c'est que le lien dans la balise <a> est incorrect. Il manque le nom de domaine. Enfin, le lien relatif est mauvais. Essaye de mettre un lien absolu, peut-être que cela passera mieux.

Bonjour et merci d'avoir répondu.

Je viens d'essayer en remplaçant dans défaut.php le code suivant :

<li><a href="<?php echo Router::url('blog/'); ?>">Lasts Bets</a></li>

par :

<li><a href="http://help-betting.franceserv.com/blog">Lasts Bets</a></li>

Cette fois la page trouvée n'est pas une erreur, mais ça me renvoi sur la page d'accueil...

Je me demandais si l'erreur venait pas de l'URL rewriting mais comme la page d'accueil est trouvée c'est que ça fonctionne quand même bien cet url rewriting non?

Les fichiers existe au moins ? Ne serais-ce pas à cause d'un codage ajax ? Je dis ça, mais complètement au pifomètre.

Pour tout te dire je pense que mon ou mes erreurs proviennent de la gestion des routes (c'est d'ailleurs ce que j'ai le moins compris du tuto...) mais j'avais réussi à ce que ça marche en local donc je ne vois pas ou pourrait se situer mon erreur là...
Bon en rajoutant le nom de domaine dans mon fichier conf.php maintenant ben ça m'envoie que sur la page d'accueil...
Si ça peut aider quelqu'un voila mon fichier conf.php:

<?php
class Conf{

    static $debug = 1; 
    static $databases = array(
        'default' => array(
            'host' => ' *******',
            'database'  => ' *******',
            'login' => ' *******',
            'password'  => ' *******'
        )
    );

}
Router::prefix(' *******','admin');
Router::connect('','posts/slider');
Router::connect('help-betting.franceserv.com/cockpit','help-betting.franceserv.com/cockpit/posts/index');
Router::connect('help-betting.franceserv.com/page/:slug-:id','help-betting.franceserv.com/pages/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/:slug-:id','help-betting.franceserv.com/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/category/:slug','help-betting.franceserv.com/posts/category/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/*','help-betting.franceserv.com/posts/*');

et donc dans mon défaut.php les liens du menu sont de la forme suivante :

<li><a href="<?php echo Router::url('help-betting.franceserv.com/pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a></li>

Avant que je rajoute le nom de domaine partout, ça me donnait le même résultat que lorsqu'on clique sur les liens dans le slider (j'ai pas encore corriger pour que vous puissiez voir la différence) ;)

Et si tu help-betting.franceserv.com dans chaque ligne de tes connect

Si j'enlève? Ben c'est ce que j'avais en local mais ça marche pas une fois en ligne. En gros ça m'envoyait sur des pages dont l'url était " http://posts/view/id:38/slug:thailand-guamu19 "...
Et si je le rajoute dans le premier connect ça me dit que le contrôler help-betting.franceserv.con n'existe pas!
Sinon j'ai vérifié et ça vient pas des url rewriting j'en suis quasi sur!

Quelqu'un a une idée?

Montre moi ta fonction connect de la classe Router stp

Voila :

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

Première remarque je trouve ton code très mal commenté voir pas du tout, je suis pas sur que tu te souvienne de chaque expression régulière dans 1 ou 2 mois :)

Ceci étant dit je ne voit pas du tout ou est ton soucis... Dans le phpinfo as tu le mod_rewrite qui est chargé ? Et question idiote as-tu bien ton .htaccess à la racine de ton mvc et éventuellement dans ton répertoire public (le webroot en fait) ? Il semblerait que oui vu les symptômes mais malgré tout je m'en assure.

Et tant qu'a faire peux tu me montrer ton fichier conf.php et la fonction url de ton Router. Et pour les tests que l'on va faire, fait un roleback sur les endroits ou tu as ajouté ton nom de domaine à chaque règle de routing.

"Dans le phpinfo as tu le mod_rewrite qui est chargé ? " Comment je peux vérifier ça?
Pour les .htaccess ils sont à la racine et dans le webroot oui.

Le fichier conf.php :

<?php
class Conf{

    static $debug = 1; 
    static $databases = array(
        'default' => array(
            'host' => ' ************',
            'database'  => ' ************',
            'login' => ' ************',
            'password'  => ' ************'
        )
    );

}

Router::prefix(' ************','admin');

Router::connect('','posts/slider');
Router::connect('help-betting.franceserv.com/cockpit','help-betting.franceserv.com/cockpit/posts/index');
Router::connect('help-betting.franceserv.com/page/:slug-:id','help-betting.franceserv.com/pages/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/:slug-:id','help-betting.franceserv.com/posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/category/:slug','help-betting.franceserv.com/posts/category/slug:([a-z0-9\-]+)');
Router::connect('help-betting.franceserv.com/blog/*','help-betting.franceserv.com/posts/*');

Fonction url du routeur :

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

Par contre je comprends pas ce que tu veux dire par : "un roleback sur les endroits ou tu as ajouté ton nom de domaine à chaque règle de routing."...

Sinon je précise que tout marchait très bien en local, je n'avais aucun problème et c'est donc pour ça que j'ai décidé de l'héberger...

Alors pour le mod_rewrite tu fais un nouveau fichier php accessible depuis ton serveur dans lequel tu met le code suivant :

<?php
    phpinfo();
?>

Ensuite tu accèdes a ce fichier via ton navigateur et tu regardes si le module rewrite est chargé.
J'avais pas vu que tu avais déjà posté ta conf autant pour moi. Ou est définie la globale BASE_URL ? D'ailleurs dans ta fonction "url" met juste en dessous de la ligne 16 (return BASE_URL.'/'.$url; ) le code suivant :

echo "Debug : " . BASE_URL;die();

Et dit moi ce que ça affiche !

Bon comme je veux pas faire de conneries je vais faire pas à pas.
Alors pour le phpinfo il est disponible Ici y a bien marqué quelque chose sur rewrite mais je préfère te montrer voir si c'Est ça : "url_rewriter.tags a=href,area=href,frame=src,input=src,form=,fieldset= a=href,area=href,frame=src,input=src,form=,fieldset=" c'est toute la ligne dans Standard.

Sinon la gloabale BASE_URL est définie dans /webroot/index.php :

<?php
$debut = microtime(true); 
define('WEBROOT',dirname( __FILE__ )); 
define('ROOT',dirname(WEBROOT)); 
define('DS',DIRECTORY_SEPARATOR);
define('CORE',ROOT.DS.'core'); 
define('BASE_URL',dirname(dirname($_SERVER'SCRIPT_NAME']))); 
require CORE.DS.'includes.php'; 
new Dispatcher(); 
?>

Par contre ton code n'affiche rien sauf si j'ai mal fait...

Mouais ton hébergeur a tronqué le phpinfo normalement il y une section "Apache Loaded Modules" que je ne voit pas chez toi.
On va faire un test pour avoir el coeur net que l'UrlRewriting est activé. Créé un nouveau repertoire Test dans lequel tu met un fichier "toto.php". Dans ce fichier tu met le code suivant :

<p>Si ce texte s'afficher j'ai l'url rewriting</p>

Puis dans le même répertoire un fichier ".htaccess" (sans les guillemets) ou tu met le code suivant :

RewriteEngine on
RewriteRule ^toto\.html$ /toto.php [L]

Et accès dans ton navigateur web à la page toto.html.

Qu'est ce qui s'affiche ?

Pour mon code de tout à l'heure ta fonction url doit ressemblée à ça je t'ai dit une connerie car j'ai mi le code après le return :D

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); 
            }
        }
        echo "Debug : " . BASE_URL;die();
        return BASE_URL.'/'.$url; 
    }

Ça affiche la même page qu'avant c'est à dire la page accueil si je fais comme tu m'as dis. Mais faudrait pas plutôt que je mette le code :[code]RewriteEngine on RewriteRule ^toto.html$ /toto.php [L][/code] dans le .htaccess à la racine du site? Sinon là tu peux voir le résultat de ton code dans la fonction url. En gros ça affiche plus le menu et ça fait perdre pas mal de données...

Non ca c'est vraiment pour tester l'url rewriting a la limite dégage tout ce qui est à la racine de ton serveur .htaccess compris et met le tout dans un repertoire "save" et met juste le .htaccess et le toto.php a la racine de ton serveur et essaye. On aura notre réponse si l'url rewriting est activé.
et accède comme ca : www.tonsite.com/toto.html

Et tu as bien le .htaccess au même niveau que le toto.php ? avec le code que j'ai mis plus haut ?
Si oui ca veut dire que l'url rewriting n'est pas activé et dans ce cas il faut te rapprocher de ton hébergeur.
Si tu veux faire un test final pour le savoir envoi moi ton code et ton sql je reproduit sur mon dédié ou je sais qu'il y a le rewriting.

Pourtant j'ai trouvé un message de l'admin sur le forum qui disait que l'url rewriting était bien présent.
Je peux tout t'envoyer oui si tu veux enfin je veux pas non plus t'embêter...

Pas de soucis
met tout dans un zip sur ton serveur et tu me met le lien :)

Pour info j'ai mis le .htaccess pour rediriger vers toto.php a la racine du site et là ça marche nickel.
Code :
SQL :
Merci

ah bah c'est bon alors...
Bon je télécharge ton code et je regarde

Ok merci du temps que tu prends en tout cas ;)

Alors ça marche chez moi pour preuve ici : http://www.youpibox.com/grafikart/
Bon le css n'est pas pris en compte mais j'ai vu qu'a plusieurs endroits tu précisait "webroot" dans les chemins, ce n'est pas nécessaire étant donné que tu as une réécriture d'url dans ton .htaccess. Donc du coup tous les liens sont foireux. Déjà enlève ce webroot partout il n'a pas lieu d'être au contraire car ça donne une information aux méchants hackers sur l'arborescence de ton site !

Donc a mon avis il y a un problème de configuration chez ton hébergeur... Surement l'url rewriting qui réagit mal ou tout simplement pas configuré. Je vais regarder le pourquoi du comment.

Ok bon c'est changé pour le css merci déjà

Bon selon ton hébergeur c'est activé... Bon la y'a un truc qui m'échappe alors !

Eventuellement tente de rajouter avant le "RewriteEngine On" ceci dans tous les htaccess :

Options +FollowSymlinks

Toujours pareil...
Sinon je vais me chercher un autre hébergeur ça risque d'être bien plus simple...

Oui je crois bien car ton code est a mon avis bon mis à part ce problème ou webroot apparait dans tous les liens et ou ca ne devrait pas être le cas. Malheureusement en gratuit c'est souvent moyen :(
Un dédié ca commence à 15€ par mois... ^^

Oui c'est moyen mais pour ce que je voulais ça suffisait amplement... ;)
Bon on verra plus tard là je suis crevé ^^
Merci pour tout en tout cas ;)