Мои маршруты возвращают 404, как я могу их исправить?
Я только начал изучать структуру 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 Не найдена ошибка. Почему это происходит?
Ответы
Ответ 1
Вы пытались добавить это в свой файл маршрутов вместо Route::get('user', "[email protected]")
?
Кусок текста перед @
, user
в этом случае направит страницу на пользовательский контроллер, а фрагмент текста после @
, index
направит script на user
функция public function get_index()
.
Я вижу, что вы используете $restful
, и в этом случае вы можете установить Route
в Route::any('user', '[email protected]')
. Это будет обрабатывать как POST
, так и GET
вместо того, чтобы записывать их оба отдельно.
Ответ 2
В моей установке Ubuntu LAMP я решил эту проблему со следующими 2 изменениями.
- Включить mod_rewrite на сервере apache:
sudo a2enmod rewrite
.
- Изменить /etc/apache2/apache2.conf, изменив директиву "AllowOverride" для каталога /var/www (который является моим основным корнем документа):
AllowOverride All
Затем перезапустите сервер Apache: service apache2 restart
Ответ 3
С помощью WAMP нажмите значок wamp → apache- > apache modules- > прокрутите и проверьте rewrite_module
Перезапустить
LoadModule rewrite_module
Обратите внимание: серверное приложение автоматически запускается для вас после включения "rewrite_module"
Ответ 4
Вы пытались проверить,
http://localhost/mysite/public/index.php/user
работал? Если это так, убедитесь, что все папки вашего пути не имеют заглавных букв. У меня была такая же ситуация, и мне помогли конвертировать письма в нижний регистр.
Ответ 5
У меня была проблема с 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>
Ответ 6
Вы можете попытаться переместить root/public/.htaccess
в root/.htaccess
, и он должен работать
Ответ 7
Маршруты
Используйте их для определения определенных маршрутов, которые не управляются контроллерами.
Контроллеры
Используйте их, если хотите использовать традиционную архитектуру MVC
Решение вашей проблемы
Вы не регистрируете контроллеры в качестве маршрутов, если не хотите использовать определенный маршрут "named" для действия контроллера.
Вместо того, чтобы создавать маршрут для действий ваших контроллеров, просто зарегистрируйте свой контроллер:
Route::controller('user');
Теперь ваш контроллер зарегистрирован, вы можете перейти к http://localhost/mysite/public/user
, и ваш get_index
будет запущен.
Вы также можете зарегистрировать все контроллеры за один раз:
Route::controller(Controller::detect());
Ответ 8
Не забудьте "RewriteBase
" в вашем public/.htaccess
:
Например:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
Ответ 9
Хорошо, поэтому, немного потрепав голову над этой проблемой чуть больше дня... Я встал и сделал то, что я ДОЛЖЕН вчера сделать, и ЗАБЫЛ, что происходит!
Что 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 (особенно если у вас есть доступ к этой папке).
Ответ 10
Попробуйте включить короткие php-теги в php.ini. WAMP их обычно отключает, и laravel нуждается в них.
Ответ 11
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) в конце ваших маршрутов
Ответ 12
вы должны использовать 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 для просмотра и контроллера см. в документации, в которой у меня была такая же ошибка перед
Ответ 13
Просто запустите в своем терминале.
composer dump-autoload
Ответ 14
Основная проблема, с которой работает маршрут, - это модуль mod_rewrite.so в macos, linux не включен в файле httpad.conf конфигурации apache, поэтому может работать .htaccess.
я решил это, раскомментируя строку:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
Удалите # из строки httpdf.conf сверху. Тогда это сработает. наслаждайтесь!
Ответ 15
Я думаю, что вы удалили файл .htaccess по умолчанию в общей папке laravel. загрузите файл, он должен исправить вашу проблему.
Ответ 16
простые команды с автоматической загрузкой зависимостей
composer dump-autoload
и все еще получаю, что ваши важные файлы отсутствуют, идите сюда, чтобы увидеть всю процедуру
https://codingexpertise.blogspot.com/2018/11/laravel-new.html
Ответ 17
Если вы используете Vagrant через Homestead, возможно, произошла ошибка при монтировании общей папки. Похоже, что Vagrant берет ваши файлы из этой папки и выгружает файлы, которые на самом деле находятся на хост-машине при загрузке, поэтому, если произошла ошибка, вы, по сути, пытаетесь получить доступ к вашей установке Laravel с того момента, когда вы впервые ее сделали (что Вот почему вы получаете только "дом" - это было сгенерировано во время установки).
Вы можете легко проверить это, зайдя в ваш vm и проверив файл route/web.php, чтобы увидеть, действительно ли это ваш файл. Если это не так, выйдите и выполните vagrant halt
, vagrant up
и ищите ошибки при загрузке.
Ответ 18
Поместите ваш код в верхней части файла маршрута, он будет выполнять ваш контроллер