2012-11-08 3 views
1

J'utilise le ToroPHP pour le routage.Routage ToroPHP - action 404

Mon code:

Toro::serve(array(
    "/" => "home", 
)); 

Toro::serve(array(
    "/website/:string" => "website", 
)); 

// Fired for 404 errors 
ToroHook::add("404", function() { echo '404 error'; }); 

Plus CodeToro: serve va à cette classe, fonctionne très bien, pour les deux home et website.

class home { 
    function get() { 
     echo 'My home'; 
    } 
} 

class website { 
    function get($slug) { 
     echo $slug; 
    } 
} 

.htaccess

Voici comment mon fichier htaccess ressemble. C'est juste un peu réécrit pour fonctionner sur localhost.

Regardez la dernière ligne ...

RewriteEngine On 
RewriteBase /my_localhost_dir/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond $1 !^(index\.php) 
RewriteRule ^(.+)$ index.php/$1 [L] 

Problème

Si je vais à une page que j'ai installé avec Toro::serve, cela fonctionne très bien.

Si je vais à une URL qui n'est pas définie, cela me donne un écran blanc.

Je m'attendrais à ce qu'il me donnerait "erreur 404" par le crochet que j'ai ajouté. Qu'est-ce que je fais de mal?

Exemple: Si je vais à/nocontent/il me donne un écran blanc, et la réponse 200 ok.

+1

Réécrivez-vous toutes les demandes dans les sous-répertoires à index.php? Sinon, votre requête n'atteindra pas PHP car Apache ne trouve pas le fichier spécifié. – alexn

+0

@alexn J'ai mis à jour mon code avec/website/qui fonctionne également. Il fait écho à ma limace 'peu importe' quand je vais sur/website/whatever /. Cependant/nocontenthere/donne un écran blanc. Je n'utilise pas de dossiers, juste des URL virtuelles, mais les classes qui fonctionnent sont incluses dans un dossier mais cela ne devrait pas importer? –

Répondre

1

Assurez-vous de rediriger toutes les demandes vers index.php. Ceci est fait en utilisant mod_rewrite. Placez les éléments suivants dans votre dossier .htaccess:

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

Deuxièmement, vous utilisez Toro::serve dans le mauvais sens. Vous ne devriez pas faire plusieurs appels pour servir. Au lieu de cela, passer plusieurs routes au premier appel:

Toro::serve(array(
    "/" => "home", 
    "/website/:string" => "website", 
)); 

dernier, ajouter 404 crochet avant d'appeler servir. Dans le cas contraire, il ne sera pas trouvée:

ToroHook::add("404", function() { 
    echo "404 - Not Found"; 
}); 
+0

J'utilise un htaccess réécrit pour le faire fonctionner sur mon localhost. Cependant, les deux étapes, déplaçant le crochet d'abord ET faire tous les appels dans le même tableau a fait l'affaire! Fonctionne bien maintenant! –

3

Je crois que la définition de crochet doit venir premier, à savoir

<?php 

ToroHook::add("404", function() { 
    header('HTTP/1.1 404 Not Found'); 
    echo '404 error'; 
    exit; 
}); 

Toro::serve(array(
    "/" => "home", 
    "/website/:string" => "website", 
)); 

Aussi, assurez-vous que vous avez un .htaccess fichier réécrire toutes les demandes à index.php selon les docs. Je devrais savoir, être un contributeur au projet;)

En outre, il devrait seulement être un appeler Toro::serve(); vous lui passez juste un tableau avec le modèle d'URL comme clé et l'itinéraire à appeler comme valeur selon mon exemple ci-dessus.

+0

Je vous ai vu mis à jour sur github maintenant, sympa! Juste comme un sidenote, je n'ai pas obtenu le travail htaccess-file original sur un environnement localhost. Peut-être que le mien est meilleur (dans ma question ci-dessus)? –

+0

@ JensTörnell Bonjour Jen. Juste aller avec ce qui fonctionne. Si vous obtenez des écrans blancs de la mort alors il vaut la peine de garder un oeil sur votre journal des erreurs PHP afin que vous diagnostiquiez le problème et que vous voyiez quelles erreurs fatales empêchent l'exécution du script. –

Questions connexes