web-dev-qa-db-fra.com

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

Je viens juste de commencer à apprendre le framework Laravel et je rencontre un problème de routage.

Le seul itinéraire qui fonctionne est l’itinéraire par défaut associé à Laravel.

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

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

class User_Controller extends Base_Controller {

    public $restful = true;

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

J'ai créé un fichier view dans application/views/user/appelé index.php avec du code HTML de base, et dans routes.php, j'ai ajouté le texte suivant:

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

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

Le premier itinéraire fonctionne correctement lorsque je visite la racine (http://localhost/mysite/public) de mon navigateur Web, mais lorsque j'essaie d'accéder à mon second itinéraire avec http://localhost/mysite/public/user, l'erreur 404 Not Found est détectée. Pourquoi cela arriverait-il?

64
JasonMortonNZ

Avez-vous essayé d'ajouter ceci à votre fichier de routes à la place de Route::get('user', "user@index")?

Le morceau de texte précédant le @, user dans ce cas, dirigera la page vers le contrôleur utilisateur et le morceau de texte situé après le @, index, dirigera le script vers la user fonction public function get_index().

Je vois que vous utilisez $restful, auquel cas vous pouvez définir votre Route sur Route::any('user', 'user@index'). Ceci gérera à la fois POST et GET, au lieu de les écrire séparément. 

22
PapaSmurf

Sur mon installation Ubuntu LAMP, j'ai résolu ce problème avec les 2 modifications suivantes.

  1. Activez mod_rewrite sur le serveur Apache: Sudo a2enmod rewrite.
  2. Editez /etc/Apache2/Apache2.conf , en modifiant la directive "AllowOverride" du répertoire/var/www (qui est la racine de mon document principal): AllowOverride All

Puis redémarrez le serveur Apache: service Apache2 restart

85
Andrew Vickers

À l'aide de WAMP, cliquez sur l'icône wamp -> Apache-> Apache modules-> faites défiler et vérifiez rewrite_module Redémarrez un LoadModule rewrite_module.

Remarque, l'application serveur redémarre automatiquement pour vous une fois que vous avez activé "rewrite_module".

63
Mario Uvera

Avez-vous essayé de vérifier si 

http://localhost/mysite/public/index.php/user 

travaillait? Si c'est le cas, assurez-vous que tous les dossiers de votre chemin ne comportent pas de lettres majuscules. J'ai eu la même situation et la conversion des lettres en minuscules a aidé.

29
user1930566

J'avais le même problème avec EasyPHP. J'ai constaté que je devais spécifierAllowOverride Alldans mon bloc <Directory> dans httpd.conf. Sans cela, Apache ignore parfois votre .htaccess.

Le mien a fini par ressembler à ça ...

<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>
6
Simon East

Vous pouvez essayer de déplacer root/public/.htaccess à root/.htaccess et cela devrait fonctionner

6
Wasim A.

Routes

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

Contrôleurs

Utilisez-les lorsque vous souhaitez utiliser une architecture MVC traditionnelle

Solution à votre problème

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

Plutôt que de créer un itinéraire pour vos actions de contrôleurs, enregistrez simplement votre contrôleur:

Route::controller('user');

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

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

Route::controller(Controller::detect());
5
David Barker

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

Par exemple :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
3
Mathieu Perino

OK, donc après avoir passé tout mon temps à me préoccuper de ce problème pendant un peu plus d'une journée ... je me suis levé et j'ai fait ce que j'aurais dû faire hier, et j'ai commencé à regarder ce qui se passait!

Ce que Laravel ESSAIE de faire ici, c’est d’insérer le fichier index.php juste devant le chemin indiqué en tant que Route. SO par exemple, si vous avez spécifié un Route::get('/account/create', ..., et exécuté votre application à partir de say localhost/laravel/authenticate/public/account/create sur votre navigateur, alors Laravel souhaite exécuter localhost/authenticate/public/index.php/account/create, mais pour ce faire .... Apache doit voir que les requêtes via /wamp/www/laravel/laravel/authentication/public (votre chemin peut varier quelque peu, en fonction du lieu où votre application laravel est réellement installée, mais la dernière variable (public correspond au lieu où la substitution doit avoir lieu) doit avoir un 'RewriteRule' appliqué.

Heureusement, laravel fournit la règle de réécriture correcte dans un fichier .htaccess très pratique, directement dans le dossier public de votre application. Le PROBLÈME est que le code dans ce fichier '.htaccess' ne fonctionnera pas avec la façon dont WAMP est configuré par défaut. La raison pour laquelle SEEMS semble être le problème suggéré par muvera en haut de ce fil de discussion - le code rewrite_module doit être chargé par Apache avant que le contenu de RewriteRule ne fonctionne. Zut ça a du sens.

La partie qui N'EST PAS logique: simplement stopping et restarting Les services Apache ne prendront pas en compte les modifications nécessaires pour que WAMP fasse le bon choix avec votre RewriteRule - Je sais, j'ai essayé plusieurs fois!

Ce qui fonctionne: effectuez les modifications suggérées par muvera (voir en haut du fil de discussion) pour charger les bons modules. Ensuite, réinitialisez toute votre session Windows, libérant ainsi complètement Apache de la mémoire. Redémarrez (rechargez) WAMP et VOILA! le correctif fonctionne, le RewriteRule correct est appliqué, yada, yada; Je vis heureux pour toujours.

La bonne nouvelle de tout cela est que j'en sais BEAUCOUP plus à propos des fichiers .htaccess, RewriteRule et httpd.conf. Il existe un bon argument (performances) pour déplacer la logique du fichier public.htaccess de votre application et pour la placer dans une section Directory ... de votre httpd.conf dans votre dossier BTW de dossier Apache 'bin' (surtout si vous avez accès à ce dossier).

3
mdg

Si vous utilisez Vagrant via Homestead, il est possible qu'une erreur soit survenue lors du montage du dossier partagé. Il semblerait que Vagrant prenne vos fichiers de ce dossier et remplace les fichiers qui se trouvent réellement sur la machine hôte au démarrage. Ainsi, en cas d’erreur, vous essayez essentiellement d’accéder à votre installation de Laravel depuis le premier C’est la raison pour laquelle vous n’obtenez que le mot "maison" - généré lors de l’installation). 

Vous pouvez facilement vérifier cela en indiquant dans votre machine virtuelle et en vérifiant le fichier routes/web.php pour voir s'il s'agit bien de votre fichier. Si ce n'est pas le cas, quittez et vagrant halt, vagrant up et recherchez les erreurs au démarrage. 

0
Giovanni Orlando

vous devez utiliser Laravel 5 la commande

  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

et dans routes.php

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

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

Laravel 5 changements de commande pour la vue et le contrôleur voir la documentation que j'avais déjà la même erreur avant

0
Rohan Kalra

Il suffit de courir dans votre terminal.

 composer dump-autoload
0
Bakhtawar GIll

Le principal problème de la route ne fonctionne pas car il y a un module mod_rewrite.so dans macos, linux n'est pas activé dans le fichier httpd.conf de la configuration Apache. 

LoadModule rewrite_module libexec/Apache2/mod_rewrite.so

Supprimez le # de la ligne ci-dessus httpdf.conf. Alors ça va marcher. prendre plaisir!

0
Pramod yadav

Essayez d'activer les balises php courtes dans votre php.ini. WAMP les a généralement et Laravel en a besoin.

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

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

changer ci-dessus à 

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

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

Vous devez utiliser '/' (home/default) à la fin de vos itinéraires

0
athula

Je pense que vous avez supprimé le fichier .htaccess par défaut dans le dossier public de Laravel. télécharger le fichier, cela devrait résoudre votre problème.

0
jewelhuq

les commandes simples à chargement automatique des dépendances

composer dump-autoload

et toujours obtenir que vos quelques fichiers importants manquent alors allez ici pour voir la procédure entière

https://codingexpertise.blogspot.com/2018/11/laravel-new.html

0
user10730910