89 votes

Mes routes renvoient un 404, comment puis-je les réparer ?

Je viens de commencer à apprendre le framework Laravel et j'ai un problème avec le routage.

La seule route qui fonctionne est la route d'accueil par défaut qui est attachée à Laravel par défaut.

J'utilise WAMP sous Windows, PHP 5.4.3 et Apache 2.2.22. J'ai également activé mod_rewrite et j'ai supprimé le fichier 'index.php' du fichier de configuration application.php pour laisser une chaîne vide.

J'ai créé un nouveau contrôleur appelé Utilisateur :

class User_Controller extends Base_Controller {

    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

J'ai créé un fichier de vue dans application/views/user/ appelé index.php avec un code HTML de base, et dans routes.php j'ai ajouté ce qui suit :

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

La première route fonctionne bien lorsqu'on visite la racine ( http://localhost/mysite/public ) dans mon navigateur web, mais lorsque j'essaie d'accéder à ma seconde route avec http://localhost/mysite/public/user Je reçois une erreur 404 Not Found. Pourquoi cela se produit-il ?

6voto

Wasim Points 1271

Vous pourriez essayer de déplacer root/public/.htaccess a root/.htaccess et cela devrait fonctionner

5voto

David Barker Points 6450

Routes

Utilisez-les pour définir des routes spécifiques qui ne sont pas gérées par les contrôleurs.

Contrôleurs

Utilisez-les lorsque vous souhaitez utiliser une architecture MVC traditionnelle.

Solution à votre problème

Vous n'enregistrez pas les contrôleurs en tant que routes, sauf si vous voulez une route spécifique "nommée" pour une action de contrôleur.

Plutôt que de créer une route pour les actions de votre contrôleur, il suffit d'enregistrer votre contrôleur :

Route::controller('user');

Maintenant que votre contrôleur est enregistré, vous pouvez naviguer vers http://localhost/mysite/public/user et votre get_index sera exécuté.

Vous pouvez également enregistrer tous les contrôleurs en une seule fois :

Route::controller(Controller::detect());

4voto

mdg Points 96

OK, donc après m'être tapé la tête contre ce problème pendant un peu plus d'un jour... Je me suis levé et j'ai fait ce que j'aurais dû faire hier, et j'ai DEBUGGÉ ce qui se passait !

Ce que Laravel ESSAIE de faire ici, c'est d'insérer le fichier index.php juste devant le chemin donné comme itinéraire. Ainsi, par exemple, si vous avez spécifié un Route::get('/account/create', ..., et exécutez votre application depuis disons localhost/laravel/authenticate/public/account/create sur votre navigateur, alors laravel veut exécuter localhost/authenticate/public/index.php/account/create mais pour ce faire, .... Apache doit voir que les requêtes qui passent par /wamp/www/laravel/laravel/authentication/public (votre chemin d'accès peut varier quelque peu, en fonction de l'endroit où votre application Laravel est installée, mais la terminaison public est l'endroit où la substitution doit avoir lieu) doit avoir une "RewriteRule" appliquée.

Heureusement, Laravel fournit la règle de réécriture correcte dans un fichier très pratique. .htaccess dans le dossier de votre application public dossier. Le PROBLÈME est que le code dans ce fichier '.htaccess' ne fonctionnera pas avec la façon dont WAMP est configuré. La raison de ce problème semble être le problème suggéré par muvera au début de ce fil de discussion -- le code rewrite_module doit être chargé par Apache avant que le fichier '.htaccess' ne soit chargé. RewriteRule Les trucs vont marcher. Heck, ça a du sens.

La partie qui n'a pas de sens : simplement stopping y restarting Les services Apache ne prendront pas en compte les changements nécessaires pour que WAMP fasse la bonne chose avec votre RewriteRule - je le sais, j'ai essayé plusieurs fois !

Ce qui fonctionne : faites les changements suggérés par muvera (voir en haut du fil de discussion) pour charger les modules corrects. Ensuite, réinitialisez votre session Windows, ce qui vide Apache de sa mémoire. Redémarrez (rechargez) WAMP, et VOILA ! la correction fonctionne, la RewriteRule correcte est appliquée, yada, yada ; je vis heureux pour toujours.

La bonne nouvelle de tout ça : J'en sais BEAUCOUP plus sur .htaccess , RewriteRule y httpd.conf les dossiers maintenant. Il y a un bon argument (de performance) pour déplacer la logique de votre application public .htaccess et le mettre dans un fichier Directory ... de votre httpd.conf dans votre dossier 'bin' d'Apache (surtout si vous avez accès à ce dossier).

4voto

Priyanka Rathod Points 31

Il suffit d'exécuter dans votre terminal.

php artisan route:clear

3voto

Mathieu Perino Points 11

N'oubliez pas le " RewriteBase " dans votre public/.htaccess :

Par exemple :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X