Moje trasy zwracają kod 404, jak mogę je naprawić?

82

Właśnie zacząłem uczyć się frameworka Laravel i mam problem z routingiem.

Jedyną działającą trasą jest domyślna trasa domowa dołączona do Laravel po wyjęciu z pudełka.

Używam WAMP w systemie Windows i używam PHP 5.4.3 i Apache 2.2.22, a także mam włączoną mod_rewrite i usunąłem „index.php” z pliku konfiguracyjnego application.php, aby zostawić pusty ciąg.

Utworzyłem nowy kontroler o nazwie User :

class User_Controller extends Base_Controller {

    public $restful = true;

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

Utworzyłem plik widoku w application / views / user / o nazwie index.php z podstawowym kodem HTML, a w route.php dodałem:

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

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

Pierwsza trasa działa dobrze podczas odwiedzania root ( http://localhost/mysite/public) w mojej przeglądarce internetowej, ale kiedy próbuję przejść do mojej drugiej trasy http://localhost/mysite/public/user, pojawia się błąd 404 Not Found. Dlaczego tak się dzieje?

JasonMortonNZ
źródło
.Htaccess jest niezmodyfikowany, tak jak po wyjęciu z pudełka.
JasonMortonNZ
Wygląda na to, że problemem był WAMP. Zmieniłem się na XAMPP teraz i wszystko działa świetnie i tak, jak powinno. Czy powinienem samodzielnie odpowiedzieć na to pytanie, wyjaśniając, że problemem był WAMP?
JasonMortonNZ
@AquilaSolutions Tak, możesz. Dzięki temu wszyscy wyraźnie zobaczą, że Twój problem został rozwiązany.
Jocelyn

Odpowiedzi:

25

Czy zamiast tego próbowałeś dodać to do pliku tras Route::get('user', "user@index")?

Fragment tekstu przed @, userw tym przypadku, przekieruje stronę do kontrolera użytkownika, a fragment tekstu po @,index będzie kierować skrypt do userfunkcji public function get_index().

Widzę, że używasz $restful, w takim przypadku możesz ustawić Routena Route::any('user', 'user@index'). Spowoduje to obsługę obu POSTi GET, zamiast zapisywać je oddzielnie.

Tata Smerf
źródło
Zmieniam z WAMP na XAMPP, ponieważ problem pozostał. Po uruchomieniu nowego projektu na serwerze XAMPP i użyciu symbolu „@” zamiast „.” teraz działa świetnie.
JasonMortonNZ
1
Działa dobrze z WAMP, wystarczy włączyć rewrite_module. Zobacz komentarz @ Muvera poniżej.
ajon
3
Wiem, że to stara odpowiedź, ale miałem podobny problem: nowa trasa została dodana i nie działa! (404). Musiałem tylko wyczyścić trasy z pamięci podręcznej! używając php artisan route: clear
trainoasis
119

W mojej instalacji Ubuntu LAMP rozwiązałem ten problem z następującymi 2 zmianami.

  1. Włącz mod_rewrite na serwerze apache: sudo a2enmod rewrite.
  2. Edytuj /etc/apache2/apache2.conf , zmieniając dyrektywę „AllowOverride” dla katalogu / var / www (który jest moim głównym katalogiem głównym):AllowOverride All

Następnie zrestartuj serwer Apache: service apache2 restart

Andrew Vickers
źródło
To rozwiązało ten problem na komputerze włóczęgów pobranym z marionetki.
winkbrace
5
Dzięki, ratujesz życie.
Hassan Murtaza
3
Wielkie
Pracował dla mnie na MacOS High Sierra 10.13.3 z Laravel-5.4
Yevgeniy Afanasyev
2
@McSonk, prawdopodobnie pytanie dotyczy okien. To alternatywne rozwiązanie działa na Ubuntu. Dzięki stary.
Fendi Septiawan,
63

Używając WAMP, kliknij ikonę wampa -> apache-> apache modules-> przewiń i zaznacz rewrite_module Uruchom ponownie LoadModule rewrite_module

Uwaga, aplikacja serwera automatycznie uruchamia się ponownie po włączeniu funkcji „rewrite_module”

Mario Uvera
źródło
DUŻO DZIĘKUJĘ, że od wczoraj próbuję rozwiązać ten problem
Moe
2
Wydaje się, że zdarza mi się to za każdym razem, gdy instaluję / ponownie instaluję WAMP i Laravel na komputerze. To jest zawsze problem. Miejmy nadzieję, że w końcu zapadnie w pamięć;)
Kenmore
W Ubuntu 14.04 działało „sudo a2enmod rewrite”, a następnie „sudo service apache2 restart”.
nspo
dla systemów linuxowych włącz przepisywanie modułu sudo a2enmod rewritepo tym restarcie sudo service apache2 restart
aimme
35

Czy próbowałeś sprawdzić, czy

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

pracował? Jeśli tak, upewnij się, że wszystkie foldery w Twojej ścieżce nie zawierają wielkich liter. Miałem taką samą sytuację i zamiana liter na małe pomogła.

user1930566
źródło
Dzięki. Przeglądam książkę Laravel (Laravel Starter) krok po kroku i utknąłem z trasą do zamknięcia (strona 13). To rozwiązało ten problem.
Steve Lindsey,
To rozwiązało mój problem. Miałem .htaccess w katalogu głównym mojego folderu Apache, który zepsuł htaccess programu laravel.
Maarten00,
To rozwiązało inny problem, jaki miałem. Używanie Laravel do generowania stron i Angulara do wywoływania REST w systemie Windows wywołanieapi/branches zadziałało, ale Linux musiałem zmienić ten adres URL na przykład: Czy jest index.php/api/branchesjakiś sposób, aby rozwiązać ten problem, aby mieć te same adresy URL?
miroslavign
Nigdy nie myślałem, że
wielkość liter ma znaczenie
zamiast tego umieść plik .htaccess z publicznego / folderu w katalogu głównym projektu, a następnie możesz uzyskać do niego dostęp przezhttp://localhost/mysite/user
Rohan Khude,
9

Miałem ten sam problem podczas korzystania z EasyPHP. Okazało się, że musiałem określić AllowOverride Allw moim <Directory>bloku w httpd.conf. Bez tego Apache czasami ignoruje twój .htaccess.

Mój wyglądał tak ...

<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>
Simon East
źródło
W systemie Debian GNU / Linux 7.6 znalazłem, że ta odpowiedź zawierała część tego, co było wymagane, oprócz włączenia modułu dla apache2 (przepisanie a2enmod).
Kevin Buchs,
6

Można spróbować przenieść root/public/.htaccesssię root/.htaccessi powinno działać

Wasim A.
źródło
4
Opublikowałeś dokładnie tę samą odpowiedź na 8 pytań. Jeśli uważasz, że są duplikatami, powinieneś oznaczyć je jako takie i nie publikować odpowiedzi do każdego z nich.
Jaap
5

Trasy

Użyj ich do zdefiniowania określonych tras, które nie są zarządzane przez kontrolery.

Kontrolery

Użyj ich, jeśli chcesz korzystać z tradycyjnej architektury MVC

Rozwiązanie Twojego problemu

Nie rejestrujesz kontrolerów jako tras, chyba że chcesz mieć określoną „nazwaną” trasę dla akcji kontrolera.

Zamiast tworzyć trasę dla akcji kontrolerów, po prostu zarejestruj swój kontroler:

Route::controller('user');

Teraz twój kontroler jest zarejestrowany, możesz przejść do http://localhost/mysite/public/useri twój get_indexbędzie uruchomiony.

Możesz także zarejestrować wszystkie kontrolery za jednym razem:

Route::controller(Controller::detect());
David Barker
źródło
3

Nie zapomnij o znaku „ RewriteBase” w public/.htaccess:

Na przykład :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
Mathieu Perino
źródło
gdzie umieścisz to w pliku?
Goddard
3

OK, więc po tym jak waliłem głowę w ten problem przez nieco ponad dzień ... Wstałem i zrobiłem to, co POWINIENEM zrobić wczoraj i ROZBUDOWAŁEM co się dzieje!

To, co Laravel stara się tutaj zrobić, to wstawienie pliku index.phpbezpośrednio przed ścieżką podaną jako Route. Na przykład, jeśli podałeś Route::get('/account/create', ...,i uruchomisz aplikację z powiedzmy localhost/laravel/authenticate/public/account/createw przeglądarce, wtedy laravel chce wykonać localhost/authenticate/public/index.php/account/create, ale aby to zrobić .... Apache musi przejrzeć te żądania /wamp/www/laravel/laravel/authentication/public(Twoja ścieżka może się nieco różnić, w zależności od tego, gdzie laravel jest faktycznie zainstalowana, ale końcowy plikpublic musi nastąpić zamiana) musi mieć zastosowaną regułę „RewriteRule”.

Na szczęście laravel dostarcza poprawną regułę przepisywania w poręcznym .htaccesspliku w folderze aplikacji public. Problem polega na tym, że kod w tym pliku „.htaccess” nie będzie działał w sposób, w jaki WAMP jest skonfigurowany po wyjęciu z pudełka. Powodem tego SEEMS jest problem zasugerowany przez muverę na początku tego wątku - kod rewrite_module musi zostać załadowany przez Apache, zanim RewriteRulewszystko zadziała. Heck to ma sens.

Część, która NIE MA sensu: po prostu, stoppinga restartingusługi Apache nie przyjmą zmian niezbędnych do tego, aby WAMP działał poprawnie z regułą RewriteRule - wiem, próbowałem tego wiele razy!

Co DZIAŁA: wprowadź zmiany sugerowane przez muverę (patrz początek wątku), aby załadować właściwe moduły. Następnie zresetuj całą sesję systemu Windows, całkowicie usuwając Apache z pamięci. Zrestartuj (przeładuj) WAMP i VOILA! poprawka działa, stosowana jest poprawna Reguła RewriteRule, yada, yada; Żyję długo i szczęśliwie.

Dobrą wiadomością z tym wszystkim: Znam wiele więcej na temat .htaccess, RewriteRulei httpd.confpliki teraz. Istnieje dobry (wydajnościowy) argument przemawiający za przeniesieniem logiki z public .htaccesspliku aplikacji i umieszczeniem jej w Directory ...sekcji twojego httpd.conf w folderze „bin” Apache BTW (szczególnie jeśli masz dostęp do tego folderu).

mdg
źródło
0

Spróbuj włączyć krótkie tagi php w swoim php.ini. WAMP zwykle je wyłącza i Laravel ich potrzebuje.

dajavax
źródło
Czekaj, co? Laravel potrzebuje krótkich tagów?
biskup
0
Route::get('/', function()
{
return View::make('home.index');
});

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

zmień powyżej na

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

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

Na końcu tras musisz użyć znaku „/” (home / default)

Athula
źródło
0

musisz używać polecenia Laravel 5

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

oraz w route.php

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

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

Zmiany poleceń Laravel 5 dla widoku i kontrolera znajdują się w dokumentacji, w której miałem wcześniej ten sam błąd

Rohan Kalra
źródło
0

Po prostu uruchom swój terminal.

 composer dump-autoload
Bakhtawar GIll
źródło
0

Myślę, że usunąłeś domyślny plik .htaccess w publicznym folderze laravel. prześlij plik, który powinien rozwiązać twój problem.

jewelhuq
źródło
0

Jeśli używasz Vagrant przez Homestead, możliwe, że wystąpił błąd podczas montowania udostępnionego folderu. Wygląda na to, że Vagrant pobiera twoje pliki z tego folderu i zamienia pliki, które faktycznie znajdują się na komputerze hosta podczas rozruchu, więc jeśli wystąpił błąd, zasadniczo próbujesz uzyskać dostęp do instalacji Laravel od momentu jej pierwszego wykonania (co dlatego otrzymujesz tylko „dom” - który został wygenerowany podczas instalacji).

Możesz to łatwo sprawdzić przez ssh do swojej maszyny wirtualnej i sprawdzając plik route / web.php, aby zobaczyć, czy to faktycznie jest Twój plik. Jeśli tak nie jest, wyjść na zewnątrz i vagrant halt, vagrant upi szukać błędów na starcie.

Giovanni Orlando
źródło
0
  1. plik setup .env
  2. skonfigurować index.html
  3. upewnij się, że masz .htaccess
  4. sudo service apache2 restart

najprawdopodobniej jest to spowodowane problemami z pamięcią podręczną

Abhi
źródło
0

Głównym problemem niedziałającej trasy jest moduł mod_rewrite.so w macosie, Linux nie jest włączony w pliku httpd.conf konfiguracji apache, więc może .htaccess do pracy. rozwiązałem ten problem, odkomentowując wiersz:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Usuń #z powyższej linii httpdf.conf. Wtedy zadziała.
cieszyć się!

Pramod yadav
źródło