Мої маршрути повертають 404, як я можу їх виправити?


82

Я тільки почав вивчати фреймворк Laravel, і у мене проблема з маршрутизацією.

Єдиний робочий маршрут - це домашній маршрут за замовчуванням, який прикріплений до Laravel з коробки.

Я використовую WAMP в Windows, і він використовує PHP 5.4.3 та Apache 2.2.22, а також у мене ввімкнено mod_rewrite і видалив 'index.php' з конфігураційного файлу application.php, щоб залишити порожній рядок.

Я створив новий контролер під назвою User :

class User_Controller extends Base_Controller {

    public $restful = true;

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

Я створив файл перегляду в application / views / user / з назвою index.php з деяким базовим HTML-кодом, а в routes.php додав наступне:

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

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

Перший маршрут чудово працює під час відвідування root ( http://localhost/mysite/public) у моєму веб-браузері, але коли я намагаюся перейти до мого другого маршруту із http://localhost/mysite/public/userпомилкою 404 Not Found. Чому це відбувається?


.Htaccess не модифікований, як і нестандартно.
JasonMortonNZ

Схоже, що проблема полягала в WAMP. Змінилися на XAMPP зараз, і все працює чудово і як слід. Чи слід самостійно відповідати на це запитання, пояснюючи, що проблема полягає в WAMP?
JasonMortonNZ

@AquilaSolutions Так, ви можете. Тож усі чітко побачать, як ваша проблема вирішена вже зараз.
Джоселін

Відповіді:


25

Ви намагалися натомість додати це до свого файлу маршрутів Route::get('user', "user@index")?

Фрагмент тексту до @, userв цьому випадку, буде направляти сторінку на контролер користувача і фрагмент тексту після того @, indexбуде направляти скрипт в userфункцію public function get_index().

Бачу, ти використовуєш $restful, і в такому випадку ти міг би встановити Routeдля себе Route::any('user', 'user@index'). Це впорається з обома POSTі GETзамість того, щоб виписувати їх обидва окремо.


Я переходжу з WAMP на XAMPP, оскільки проблема залишалася. Після запуску нового проекту на сервері XAMPP і використання символу '@' замість '.' зараз він чудово працює.
JasonMortonNZ

1
Він чудово працює з WAMP, вам просто потрібно увімкнути rewrite_module. Дивіться коментар @ Muvera нижче.
ajon

3
Я знаю, що це стара відповідь, але у мене була подібна проблема: додано новий маршрут, який не працює! (404). Мені потрібно було лише очистити кешовані маршрути! за допомогою php-ремісничого маршруту: ясно
trainoasis

119

На моїй установці LAMP Ubuntu я вирішив цю проблему за допомогою наступних 2 змін.

  1. Включення mod_rewrite на сервері Apache: sudo a2enmod rewrite.
  2. Відредагуйте /etc/apache2/apache2.conf , змінивши директиву "AllowOverride" для каталогу / var / www (який є моїм основним коренем документа):AllowOverride All

Потім перезапустіть сервер Apache: service apache2 restart


Це вирішило цю проблему для мене на бродячому комп'ютері, завантаженому з puphpet.
winkbrace

5
Дякую, ви рятуєте життя.
Хасан Муртаза

3
Щиро дякую, я витратив свої 4 години, щоб знайти це
Аншул Мішра,

Працював для мене на MacOS High Sierra 10.13.3 з Laravel-5.4
Євген Афанасьєв

2
@McSonk, ймовірно, питання стосується Windows. Це альтернативне рішення працює для Ubuntu. Дякую чувак.
Fendi Septiawan

63

За допомогою WAMP клацніть на піктограму wamp -> apache-> модулі apache-> прокрутка та перевірка rewrite_module Перезапустіть LoadModule rewrite_module

Зверніть увагу, що серверна програма автоматично перезавантажується для вас, як тільки ви ввімкнете "rewrite_module"


ЩО ДЯКУЮ, намагаюся відсортувати цю проблему з вчора
пн,

2
Здається, це трапляється зі мною кожного разу, коли я встановлюю / перевстановлюю WAMP і Laravel на комп’ютері. Це завжди питання. Сподіваємось, це нарешті буде віддано пам'яті;)
Кенмор

Під Ubuntu 14.04 працював 'sudo a2enmod rewrite', а потім 'sudo service apache2 restart'.
nspo

для систем Linux увімкніть модуль перезапису sudo a2enmod rewriteпісля цього перезапуску sudo service apache2 restart
aimme

35

Ви пробували перевірити, чи

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

працював? Якщо так, то переконайтесь, що у всіх папках вашого шляху немає великих літер. У мене була така сама ситуація, і перетворення букв у малі регістри допомогло.


Дякую. Я крок за кроком переглядаю книгу Laravel (Laravel Starter) і застряг у маршруті до закриття (сторінка 13). Це вирішило цю проблему для мене.
Steve Lindsey

Це вирішило мою проблему. У мене був файл .htaccess у корені моєї папки apache, який зламав htaccess laravel.
Maarten00

Це вирішило іншу проблему, яку я мав. Використовуючи Laravel для генерації сторінок та Angular для виклику REST, у Windows виклик api/branchesспрацював, але в Linux мені довелося змінити цю URL-адресу, наприклад: index.php/api/branchesБудь-який спосіб вирішити це, щоб мати однакові URL-адреси?
miroslavign

Я ніколи не думав, що це чутливо до регістру
ClearBoth

замість цього розмістіть файл .htaccess із загальнодоступної / папки у кореневій частині проекту, тоді ви зможете отримати доступ доhttp://localhost/mysite/user
Рохан Худе

9

Я отримував ту ж проблему, використовуючи EasyPHP. Виявив, що мені довелося вказати AllowOverride Allу своєму <Directory>блоці в httpd.conf. Без цього Apache іноді ігнорує ваш .htaccess.

Моя закінчилася виглядати так ...

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

Я виявив на Debian GNU / Linux 7.6, що ця відповідь дала частину того, що потрібно, на додаток до того, щоб увімкнути модуль для apache2 (a2enmod rewrite).
Kevin Buchs,

6

Ви можете спробувати перейти root/public/.htaccessдо, root/.htaccessі це повинно спрацювати


4
Ви точно так само відповіли на 8 запитань. Якщо ви вважаєте, що це дублікати, вам слід позначити їх як такі, а не публікувати відповіді на кожен.
Яап,

5

Маршрути

Використовуйте їх для визначення конкретних маршрутів, якими не керують контролери.

Контролери

Використовуйте їх, коли хочете використовувати традиційну архітектуру MVC

Рішення вашої проблеми

Ви не реєструєте контролери як маршрути, якщо не хочете певний "іменований" маршрут для дії контролера.

Замість того, щоб створювати маршрут для дій своїх контролерів, просто зареєструйте свій контролер:

Route::controller('user');

Тепер ваш контролер зареєстрований, ви можете перейти до нього, http://localhost/mysite/public/userі ваш get_indexбуде запущений.

Ви також можете зареєструвати всі контролери одним рухом:

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

3

Не забувайте " RewriteBase" у вашому public/.htaccess:

Наприклад :

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

куди це помістити це у файл?
Годдард,

3

Добре, тож після того, як я забився головою над цією проблемою трохи більше доби ... Я піднявся і зробив те, що МЕНЕ СТАНО зробити вчора, і ДЕБУГУВУВ, що відбувається!

Тут намагається зробити Laravel, це вставити файл index.phpпрямо перед шляхом, вказаним як Маршрут. ТАК, наприклад, якщо ви вказали a Route::get('/account/create', ...,та localhost/laravel/authenticate/public/account/createзапустили свою програму, скажімо у вашому браузері, тоді laravel хоче виконати localhost/authenticate/public/index.php/account/create, але для цього .... Apache повинен бачити ці запити /wamp/www/laravel/laravel/authentication/public(ваш шлях може дещо змінюватися, залежно від додаток laravel фактично встановлено, але завершення public- це місце, де має відбутися заміна), має бути застосовано 'RewriteRule'.

На щастя, laravel надає правильне правило перезапису у зручному .htaccessфайлі прямо там, у publicпапці вашого додатка . ПРОБЛЕМА полягає в тому, що код у цьому файлі .htaccess не працюватиме з тим, як WAMP налаштовується з коробки. Причиною цього SEEMS є проблема, запропонована muvera у верхній частині цього потоку - код rewrite_module повинен бути завантажений Apache перед тим, як RewriteRuleматеріали працюватимуть. Чорт возьми, це має сенс.

Та частина , яка не має сенсу: просто stoppingі restartingпослуги Apache НЕ буде підібрати необхідні зміни для WAMP , щоб робити правильні речі з RewriteRule - Я знаю, я пробував багато разів!

Що ПРАЦЮЄ: внесіть зміни, запропоновані muvera (див. Верхню частину потоку), щоб завантажити правильні модулі. Потім скиньте весь сеанс Windows, тим самим викинувши Apache з пам'яті. Перезапустіть (перезавантажте) WAMP і VOILA! виправлення працює, застосовано правильне RewriteRule, yada, yada; Я живу щасливо до кінця.

Хороші новини з усього цього: я знаю набагато більше про те .htaccess, RewriteRuleі httpd.confфайли тепер. Існує хороший (продуктивний) аргумент для переміщення логіки з public .htaccessфайлу вашого додатка та розміщення її у Directory ...розділі вашого httpd.conf у вашій папці Apache 'bin' BTW (особливо якщо у вас є доступ до цієї папки).


0

Спробуйте увімкнути короткі теги php у вашому php.ini. WAMP зазвичай їх вимикає, і Laravel їх потребує.


Чекати, що? Laravel потребує коротких тегів?
єпископ

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

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

змінити вище на

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

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

Ви повинні використовувати '/' (домашній / за замовчуванням) наприкінці у своїх маршрутах


0

ви повинні використовувати команду Laravel 5

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

і в маршрутах.php

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

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

Зміни команди Laravel 5 для подання та контролера, див. Документацію, в якій раніше мала таку ж помилку



0

Я думаю, ви видалили файл .htaccess за замовчуванням у загальній папці laravel. завантажте файл, він повинен вирішити вашу проблему.



0

Якщо ви використовуєте Vagrant, хоча Homestead, можливо, сталася помилка під час встановлення спільної папки. Схоже, Vagrant бере ваші файли з цієї папки і замінює файли, які насправді знаходяться на хост-машині під час завантаження, тому, якщо сталася помилка, ви по суті намагаєтесь отримати доступ до вашої інсталяції Laravel з того часу, коли ви вперше зробили це ось чому ви потрапляєте лише "додому" - це було створено під час встановлення).

Ви можете легко перевірити це, ввімкнувши ваш vm та перевіривши файл routes / web.php, чи справді це ваш файл. Якщо це не так , вийдіть з і vagrant halt, vagrant upі шукати помилки при завантаженні.


0
  1. файл .env налаштування
  2. налаштувати index.html
  3. переконайтеся, що у вас є .htaccess
  4. sudo service apache2 restart

швидше за все через проблеми з кешем


0

Основною проблемою маршруту не працює є наявність модуля mod_rewrite.so у macos, Linux не увімкнено у файлі httpd.conf конфігурації apache, тому може працювати .htaccess. я вирішив це, прокоментувавши рядок:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Видаліть #рядок зверху httpdf.conf. Тоді це спрацює.
насолоджуйтесь!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.