Мои маршруты возвращают 404, как их исправить?

66

Я только начал изучать структуру 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');
    }
}

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

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

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

Первый маршрут отлично работает при посещении корня (http://localhost/mysite/public) в моем веб-браузере, но когда я пытаюсь перейти на свой второй маршрут с http://localhost/mysite/public/user я получаю 404 Не найдена ошибка. Почему это происходит?

  • 2
    Как насчет вашего .htaccess ?
  • 0
    .Htaccess не изменен, как это было из коробки.
Показать ещё 2 комментария
Теги:
routing
laravel-routing
laravel-3

18 ответов

21
Лучший ответ

Вы пытались добавить это в свой файл маршрутов вместо Route::get('user', "user@index")?

Кусок текста перед @, user в этом случае направит страницу на пользовательский контроллер, а фрагмент текста после @, index направит script на user функция public function get_index().

Я вижу, что вы используете $restful, и в этом случае вы можете установить Route в Route::any('user', 'user@index'). Это будет обрабатывать как POST, так и GET вместо того, чтобы записывать их оба отдельно.

  • 0
    Я перехожу с WAMP на XAMPP, потому что проблема осталась. После запуска нового проекта на сервере XAMPP и использования символа «@» вместо «.» сейчас работает отлично.
  • 1
    Он отлично работает с WAMP, вам просто нужно включить rewrite_module. Смотрите комментарий @ Muvera ниже.
Показать ещё 1 комментарий
79

В моей установке Ubuntu LAMP я решил эту проблему со следующими 2 изменениями.

  • Включить mod_rewrite на сервере apache: sudo a2enmod rewrite.
  • Изменить /etc/apache2/apache2.conf, изменив директиву "AllowOverride" для каталога /var/www (который является моим основным корнем документа): AllowOverride All

Затем перезапустите сервер Apache: service apache2 restart

  • 0
    Это исправило эту проблему для меня на бродячей машине, скачанной с puphpet.
  • 3
    Спасибо, ты спасатель жизни.
Показать ещё 8 комментариев
66

С помощью WAMP нажмите значок wamp → apache- > apache modules- > прокрутите и проверьте rewrite_module Перезапустить LoadModule rewrite_module

Обратите внимание: серверное приложение автоматически запускается для вас после включения "rewrite_module"

  • 3
    Спасибо, это решило мою проблему!
  • 0
    СПАСИБО МНОГО, пытаясь разобраться в этом вопросе со вчерашнего дня
Показать ещё 6 комментариев
30

Вы пытались проверить,

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

работал? Если это так, убедитесь, что все папки вашего пути не имеют заглавных букв. У меня была такая же ситуация, и мне помогли конвертировать письма в нижний регистр.

  • 0
    Благодарю. Я пошагово изучаю книгу Laravel (Laravel Starter) и застрял с маршрутизацией до замыкания (стр. 13). Это решило эту проблему для меня.
  • 0
    Это решило мою проблему. У меня был .htaccess в корне моей папки apache, который сломал htaccess laravel.
Показать ещё 4 комментария
6

Вы можете попытаться переместить root/public/.htaccess в root/.htaccess, и он должен работать

  • 3
    Вы отправили точно такой же ответ на 8 вопросов. Если вы считаете, что они являются дубликатами, вы должны пометить их как таковые, а не публиковать ответы на них.
  • 1
    И этот ответ не работает.
6

У меня была проблема с 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>
  • 0
    Я обнаружил в Debian GNU / Linux 7.6, что этот ответ дал часть того, что требовалось, помимо включения модуля для apache2 (переписывание a2enmod).
5

Маршруты

Используйте их для определения определенных маршрутов, которые не управляются контроллерами.

Контроллеры

Используйте их, если хотите использовать традиционную архитектуру MVC

Решение вашей проблемы

Вы не регистрируете контроллеры в качестве маршрутов, если не хотите использовать определенный маршрут "named" для действия контроллера.

Вместо того, чтобы создавать маршрут для действий ваших контроллеров, просто зарегистрируйте свой контроллер:

Route::controller('user');

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

Вы также можете зарегистрировать все контроллеры за один раз:

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

Хорошо, поэтому, немного потрепав голову над этой проблемой чуть больше дня... Я встал и сделал то, что я ДОЛЖЕН вчера сделать, и ЗАБЫЛ, что происходит!

Что Laravel TRYING делает здесь, вставляет файл index.php прямо перед дорожкой, указанным как Маршрут. Например, если вы указали Route::get('/account/create', ..., и выполните свое приложение из say 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 предоставляет правильное правило Rewrite в удобном .htaccess файле прямо в папке приложения public. ПРОБЛЕМА, код в этом файле .htaccess не будет работать с тем, как WAMP настроен из коробки. Причиной этого SEEMS является проблема, предложенная muvera в верхней части этого потока - код rewrite_module должен быть загружен Apache до того, как материал RewriteRule будет работать. Черт возьми, это имеет смысл.

Часть, которая НЕ имеет смысла: просто stopping и restarting Службы Apache не подберут изменения, необходимые для WAMP, чтобы делать правильные вещи с помощью RewriteRule - я знаю, я пробовал это много раз!

Что работает: внесите изменения, предложенные muvera (см. top of thread), чтобы загрузить правильные модули. Затем, reset весь ваш сеанс Windows, таким образом, полностью удалив Apache из памяти. Перезапустите (перезагрузите) WAMP и VOILA! исправление работает, применяется правильный RewriteRule, yada, yada; Я живу долго и счастливо.

Хорошая новость из всего этого: теперь я знаю больше о файлах .htaccess, RewriteRule и httpd.conf. Существует хороший (эффективный) аргумент для перемещения логики из вашего приложения public .htaccess файла и вставка его в раздел Directory ... вашего httpd.conf в папке "bin" Apache BTW (особенно если у вас есть доступ к этой папке).

3

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

Например:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
  • 0
    где вы положили это в файл?
0

Поместите ваш код в верхней части файла маршрута, он будет выполнять ваш контроллер

0

Если вы используете Vagrant через Homestead, возможно, произошла ошибка при монтировании общей папки. Похоже, что Vagrant берет ваши файлы из этой папки и выгружает файлы, которые на самом деле находятся на хост-машине при загрузке, поэтому, если произошла ошибка, вы, по сути, пытаетесь получить доступ к вашей установке Laravel с того момента, когда вы впервые ее сделали (что Вот почему вы получаете только "дом" - это было сгенерировано во время установки).

Вы можете легко проверить это, зайдя в ваш vm и проверив файл route/web.php, чтобы увидеть, действительно ли это ваш файл. Если это не так, выйдите и выполните vagrant halt, vagrant up и ищите ошибки при загрузке.

0

простые команды с автоматической загрузкой зависимостей

composer dump-autoload

и все еще получаю, что ваши важные файлы отсутствуют, идите сюда, чтобы увидеть всю процедуру

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

0

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

0

Основная проблема, с которой работает маршрут, - это модуль mod_rewrite.so в macos, linux не включен в файле httpad.conf конфигурации apache, поэтому может работать .htaccess. я решил это, раскомментируя строку:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Удалите # из строки httpdf.conf сверху. Тогда это сработает. наслаждайтесь!

0

Просто запустите в своем терминале.

 composer dump-autoload
0

вы должны использовать Laravel 5 команду

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

и в routes.php

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

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

Изменения команды Laravel 5 для просмотра и контроллера см. в документации, в которой у меня была такая же ошибка перед

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');
});

Вы должны использовать '/' (home/default) в конце ваших маршрутов

0

Попробуйте включить короткие php-теги в php.ini. WAMP их обычно отключает, и laravel нуждается в них.

  • 0
    Чего ждать? Laravel нужны короткие метки?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню