Meine Routen geben einen 404 zurück. Wie kann ich sie reparieren?


81

Ich habe gerade angefangen, das Laravel-Framework zu lernen, und ich habe ein Problem mit dem Routing.

Die einzige Route, die funktioniert, ist die Standard-Heimroute, die standardmäßig an Laravel angehängt ist.

Ich verwende WAMP unter Windows und es verwendet PHP 5.4.3 und Apache 2.2.22. Außerdem habe ich mod_rewrite aktiviert und die Datei 'index.php' aus der Konfigurationsdatei application.php entfernt, um eine leere Zeichenfolge zu hinterlassen.

Ich habe einen neuen Controller namens User erstellt :

class User_Controller extends Base_Controller {

    public $restful = true;

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

Ich habe in application / views / user / eine Ansichtsdatei mit dem Namen index.php mit einem grundlegenden HTML-Code erstellt und in route.php Folgendes hinzugefügt:

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

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

Die erste Route funktioniert einwandfrei, wenn Sie root ( http://localhost/mysite/public) in meinem Webbrowser besuchen. Wenn ich jedoch versuche, mit zu meiner zweiten Route zu http://localhost/mysite/public/userwechseln, wird der Fehler 404 Not Found angezeigt. Warum sollte das passieren?


Der .htaccess ist unverändert, so wie er sofort verfügbar war.
JasonMortonNZ

Es scheint, dass WAMP das Problem war. Habe jetzt zu XAMPP gewechselt und alles funktioniert super und wie es sollte. Sollte ich diese Frage selbst beantworten und erklären, dass WAMP das Problem war?
JasonMortonNZ

@ AquilaSolutions Ja, Sie können. So wird jeder klar sehen, dass Ihr Problem jetzt gelöst ist.
Jocelyn

Antworten:


25

Haben Sie versucht, dies stattdessen zu Ihrer Routendatei hinzuzufügen Route::get('user', "user@index")?

Das Stück Text vor dem @, userin diesem Fall wird die Seite an die Benutzer - Controller und das Stück Text nach dem direkten @, indexwird das Skript an die direkte userFunktion public function get_index().

Ich sehe , Sie verwenden $restful, in dem Fall , dass Sie Ihre einstellen könnte Routezu Route::any('user', 'user@index'). Dies behandelt beide POSTund GETanstatt beide separat zu schreiben.


Ich wechsle von WAMP zu XAMPP, weil das Problem weiterhin besteht. Nach dem Starten eines neuen Projekts auf dem XAMPP-Server und der Verwendung des Symbols '@' anstelle des Symbols '.' es funktioniert jetzt großartig.
JasonMortonNZ

1
Es funktioniert gut mit WAMP, Sie müssen nur rewrite_module aktivieren. Siehe @ Muveras Kommentar unten.
Ajon

3
Ich weiß, dass dies eine alte Antwort ist, aber ich hatte ein ähnliches Problem: Eine neue Route wurde hinzugefügt und hat nicht funktioniert! (404). Ich musste nur zwischengespeicherte Routen löschen! mit PHP
Artisan

118

Bei meiner Ubuntu LAMP-Installation habe ich dieses Problem mit den folgenden 2 Änderungen gelöst.

  1. Aktivieren Sie mod_rewrite auf dem Apache-Server : sudo a2enmod rewrite.
  2. Bearbeiten Sie /etc/apache2/apache2.conf und ändern Sie die Direktive "AllowOverride" für das Verzeichnis / var / www (das mein Hauptdokumentstamm ist):AllowOverride All

Starten Sie dann den Apache-Server neu: service apache2 restart


Dies hat dieses Problem für mich auf einer Vagabundmaschine behoben, die von puphpet heruntergeladen wurde.
Winkbrace

5
Danke, du bist ein Lebensretter.
Hassan Murtaza

3
Vielen Dank, ich habe meine 4 Stunden verschwendet, um dies zu finden
Anshul Mishra

Arbeitete für mich auf MacOS High Sierra 10.13.3 mit Laravel-5.4
Yevgeniy Afanasyev

2
@ McSonk, wahrscheinlich ist die Frage für Windows. Diese alternative Lösung funktioniert für Ubuntu. Danke Kumpel.
Fendi Septiawan

63

Klicken Sie mit WAMP auf das Wamp-Symbol -> Apache-> Apache-Module-> Scrollen und aktivieren Sie rewrite_module. Starten Sie ein LoadModule rewrite_module neu

Beachten Sie, dass die Serveranwendung automatisch für Sie neu gestartet wird, sobald Sie "rewrite_module" aktivieren.


Vielen Dank, ich habe seit gestern versucht, dieses Problem zu lösen
Moe

2
Dies scheint mir jedes Mal zu passieren, wenn ich WAMP und Laravel auf einem Computer installiere / neu installiere. Dies ist immer das Problem. Hoffentlich wird es endlich in Erinnerung bleiben;)
Kenmore

Unter Ubuntu 14.04 funktionierten 'sudo a2enmod rewrite' und dann 'sudo service apache2 restart'.
nspo

für Linux-Systeme aktivieren Sie das Umschreiben des Moduls sudo a2enmod rewritenach diesem Neustart sudo service apache2 restart
Ziel

35

Haben Sie versucht zu überprüfen, ob

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

arbeitete? Wenn ja, stellen Sie sicher, dass alle Ordner Ihres Pfads keine Großbuchstaben enthalten. Ich hatte die gleiche Situation und das Konvertieren von Buchstaben in Kleinbuchstaben half.


Vielen Dank. Ich gehe Schritt für Schritt das Laravel-Buch (Laravel Starter) durch und war mit dem Weiterleiten an einen Abschluss festgefahren (Seite 13). Dies löste das Problem für mich.
Steve Lindsey

Dies löste mein Problem. Ich hatte einen .htaccess im Stammverzeichnis meines Apache-Ordners, der den Zugriff von laravel brach.
Maarten00

Dies löste ein anderes Problem, das ich hatte. Mit Laravel zum Generieren von Seiten und Angular zum Aufrufen von REST api/branchesfunktionierte der Aufruf unter Windows , aber unter Linux musste ich diese URL wie index.php/api/branchesfolgt ändern: Gibt es eine Möglichkeit, dies zu beheben, um dieselben URLs zu haben?
Miroslavign

Ich hätte nie gedacht, dass es zwischen Groß- und Kleinschreibung unterscheidet
ClearBoth

Platzieren Sie stattdessen die .htaccess-Datei aus public / http://localhost/mysite/user
folder

9

Ich hatte das gleiche Problem mit EasyPHP. Gefunden, dass ich AllowOverride Allin meinem <Directory>Block in angeben musste httpd.conf. Ohne dies ignoriert Apache manchmal Ihre .htaccess.

Meins sah so aus ...

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

Ich fand unter Debian GNU / Linux 7.6 heraus, dass diese Antwort einen Teil dessen enthielt, was erforderlich war, zusätzlich zur Aktivierung des Moduls für Apache2 (a2enmod rewrite).
Kevin Buchs

6

Sie könnten versuchen, sich zu bewegen root/public/.htaccess, root/.htaccessund es sollte funktionieren


4
Sie haben genau die gleiche Antwort auf 8 Fragen gepostet. Wenn Sie der Meinung sind, dass es sich um Duplikate handelt, sollten Sie diese als solche markieren und nicht jeweils eine Antwort senden.
Jaap

5

Routen

Verwenden Sie diese, um bestimmte Routen zu definieren, die nicht von Controllern verwaltet werden.

Controller

Verwenden Sie sie, wenn Sie die traditionelle MVC-Architektur verwenden möchten

Lösung für Ihr Problem

Sie registrieren Controller nicht als Routen, es sei denn, Sie möchten eine bestimmte benannte Route für eine Controller-Aktion.

Anstatt eine Route für die Aktionen Ihres Controllers zu erstellen, registrieren Sie einfach Ihren Controller:

Route::controller('user');

Nachdem Ihr Controller registriert ist, können Sie zu navigieren http://localhost/mysite/public/userund Ihr Controller wird get_indexausgeführt.

Sie können auch alle Controller auf einmal registrieren:

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

3

Vergessen Sie nicht das " RewriteBase" in Ihrem public/.htaccess:

Zum Beispiel :

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

Wo legst du das in die Datei?
Goddard

3

OK, nachdem ich mich etwas mehr als einen Tag lang mit diesem Problem beschäftigt hatte ... stand ich auf und tat, was ich gestern hätte tun sollen, und entlarvte, was los war!

Was Laravel hier VERSUCHT, ist, die Datei index.phpdirekt vor dem als Route angegebenen Pfad einzufügen . Wenn Sie beispielsweise a angegeben Route::get('/account/create', ...,und Ihre App beispielsweise localhost/laravel/authenticate/public/account/createin Ihrem Browser ausgeführt haben, möchte laravel sie ausführen localhost/authenticate/public/index.php/account/create, aber um dies zu tun ... Apache muss diese Anforderungen durchsehen /wamp/www/laravel/laravel/authentication/public(Ihr Pfad kann je nach Standort etwas variieren Die Laravel-App ist tatsächlich installiert, aber im Trailing muss publicdie Ersetzung stattfinden. Es muss eine 'RewriteRule' angewendet werden.

Zum Glück liefert Laravel die richtige Rewrite-Regel in einer praktischen .htaccessDatei direkt im publicOrdner Ihrer App . Das PROBLEM ist, dass der Code in dieser '.htaccess'-Datei nicht mit der Art und Weise funktioniert, wie WAMP standardmäßig konfiguriert ist. Der Grund für dieses SEEMS ist das von muvera oben in diesem Thread vorgeschlagene Problem - der Code rewrite_module muss von Apache geladen werden, bevor das RewriteRuleZeug funktioniert. Das macht doch Sinn.

Der Teil, der keinen Sinn ergibt: Einfach stoppingund restartingApache-Dienste werden nicht die Änderungen übernehmen, die erforderlich sind, damit WAMP mit Ihrer RewriteRule das Richtige tut - ich weiß, ich habe es viele Male versucht!

Was funktioniert: Nehmen Sie die von muvera vorgeschlagenen Änderungen vor (siehe oben im Thread), um die richtigen Module zu laden. Setzen Sie dann Ihre gesamte Windows-Sitzung zurück, sodass Apache nicht mehr über genügend Arbeitsspeicher verfügt. Starten Sie WAMP und VOILA neu (laden Sie es neu)! das Update funktioniert, die richtige RewriteRule wird angewendet, yada, yada; Ich lebe glücklich bis ans Ende meiner Tage.

Die gute Nachricht aus all dies: Ich weiß viel mehr über .htaccess, RewriteRuleund httpd.confDateien jetzt. Es gibt ein gutes (Leistungs-) Argument, um die Logik aus der public .htaccessDatei Ihrer App zu verschieben und sie in einen Directory ...Abschnitt Ihrer httpd.conf in Ihrem Apache-Ordner 'bin' zu legen (insbesondere, wenn Sie Zugriff auf diesen Ordner haben).


0

Versuchen Sie, kurze PHP-Tags in Ihrer php.ini zu aktivieren. WAMP hat sie normalerweise ausgeschaltet und Laravel braucht sie an.


Warte was? Laravel braucht kurze Tags?
Bischof

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

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

oben ändern zu

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

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

Sie müssen '/' (home / default) am Ende Ihrer Routen verwenden


0

Sie müssen den Befehl Laravel 5 verwenden

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

und in route.php

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

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

Änderungen des Laravel 5-Befehls für Ansicht und Controller finden Sie in der Dokumentation, in der ich zuvor denselben Fehler hatte



0

Ich denke, Sie haben die Standard-.htaccess-Datei im öffentlichen Ordner von laravel gelöscht. Laden Sie die Datei hoch, mit der Ihr Problem behoben werden soll.



0

Wenn Sie Vagrant über Homestead verwenden, ist möglicherweise ein Fehler beim Mounten des freigegebenen Ordners aufgetreten. Es sieht so aus, als würde Vagrant Ihre Dateien aus diesem Ordner entnehmen und die Dateien, die sich beim Booten tatsächlich auf dem Host-Computer befinden, austauschen. Wenn also ein Fehler aufgetreten ist, versuchen Sie im Wesentlichen, von Anfang an auf Ihre Laravel-Installation zuzugreifen (welche) Deshalb kommen Sie nur "nach Hause" (das wurde während der Installation generiert).

Sie können dies einfach überprüfen, indem Sie in Ihre VM sshen und die Datei route / web.php überprüfen, um festzustellen, ob es sich tatsächlich um Ihre Datei handelt. Wenn dies nicht der Fall, verlassen und vagrant halt, vagrant upund suchen Fehler beim Booten.


0
  1. Setup .env Datei
  2. konfigurieren index.html
  3. Stellen Sie sicher, dass Sie haben .htaccess
  4. sudo service apache2 restart

höchstwahrscheinlich liegt es an Cache-Problemen


0

Das Hauptproblem bei nicht funktionierenden Routen besteht darin, dass in macos das Modul mod_rewrite.so vorhanden ist und Linux in der Datei httpd.conf der Apache-Konfiguration nicht aktiviert ist, sodass .htaccess funktionieren kann. Ich habe dies gelöst, indem ich die Zeile auskommentierte:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Entfernen Sie die #von oben stehende Linie von httpdf.conf. Dann wird es funktionieren.
genießen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.