Laravel 4 Все маршруты, кроме исходной ошибки 404

46

Просто попробуйте laravel 4, который я установил с помощью композитора. Установили виртуальный хост. Работает только корневой маршрут:

Route::get('/', function()
{
    return View::make('hello');
});

Даже это не работает

Route::get('/hello', function()
{
    return View::make('hello');
});

То, что я пытаюсь нажать, это TasksController в /tasks:

Route::resource('tasks', 'TasksController');

Это дает мне 404 тоже.

Что я могу делать неправильно? Я выполнял эти инструкции при установке: http://chris-schmitz.com/getting-started-with-laravel-4/

Также у меня есть файл .htaccess по умолчанию в корне моего проекта:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Я использую mac using localhost.

  • 6
    Амит: ты решил свою проблему выше? Если да, пожалуйста, опубликуйте ваше решение, потому что я столкнулся с той же проблемой с моим проектом Laravel. заранее спасибо
  • 0
    @AmitErandole Ой. Похоже, мы пропустили суть того gist.github.com/4131966, который вы опубликовали.
Теги:
routing
http-status-code-404

17 ответов

97

Просто для смеха посмотрите, работает ли /index.php/hello.

Если это так, то, скорее всего, это проблема .htaccess.

  • 1
    дерьмо! /index.php/hello работает, но /index.php/tasks дает мне ошибку 500 сейчас. WTF? Я обновлю свой вопрос содержимым htaccess
  • 1
    Я не понимаю: у меня есть мод переписан, и AllowOverride также установлен на Все
Показать ещё 13 комментариев
35

Была ли та же проблема, что и Laravel 4 на WAMP (Windows 8).
Решение, которое сработало для меня, было:

  • Откройте apache httpd.conf и найдите следующую строку:

    #LoadModule rewrite_module modules/mod_rewrite.so
    
  • Раскомментируйте эту строку (удалите #)
  • Сохранить httpd.conf
  • Перезапустить WAMP

Он должен работать!

  • 0
    У меня нет #LoadModule rewrite_module modules / mod_rewrite.so в моем httpd.conf :( это вещь для Windows8? Я использую XAMPP на Windows7
  • 13
    На Ubuntu это будет: sudo a2enmod rewrite последующим sudo service apache2 restart
Показать ещё 4 комментария
25

У меня была та же проблема, и решение позволило включить переписывающий мод на Apache2

В терминале используйте следующие команды:

$ sudo a2enmod rewrite
$ sudo service apache2 restart

И волшебство!

  • 0
    Вы и @GaryJ спасли мой день! Спасибо
  • 0
    Меня устраивает. +1
Показать ещё 1 комментарий
13

Имела точно такую ​​же проблему.

Две вещи, которые мне нужно было сделать, чтобы исправить это:

  • включить rewrite_module в Apache
  • Измените AllowOverride от None до All, например (Apache 2.4.9):

      Параметры индексов FollowSymLinks MultiViews   AllowOverride All   Требовать все предоставленные

FYI: используйте Laravel Homestead вместе с VirtualBox и Vagrant вместо WAMP. Он содержит Nginx вместо Apache, но все работает по умолчанию, поскольку он явно настроен для Laravel.

  • 0
    это работало для меня при развертывании на моем сервере. Vagrant - хорошее предложение, более явно я бы предложил либо laravel.com/docs/4.2/homestead, либо box.scotch.io, если вы хотите придерживаться Apache
  • 0
    AllowOverride работал для меня с новой установкой xampp и vhost
Показать ещё 1 комментарий
6

Даже после включения mod_rewrite вы можете столкнуться с этой проблемой, если вы наложили псевдонимы на вашу папку larvel/public.

Добавление

RewriteBase /your_apache_alias

to.htaccess делает трюк.

  • 1
    Я использовал псевдоним, и это сработало для меня.
  • 0
    У меня была такая же проблема, с использованием сервера Ubuntu 14.04. Использовал псевдоним в apache2.conf, mod_alias уже включен. Добавление rewritebase в файл .htaccess для общей папки решило проблему. Спасибо!
Показать ещё 1 комментарий
6

Вам не нужно, чтобы/при определении чего-либо другого, кроме дома:

Route::get('hello', function()
{
    return View::make('hello');
});

Должен работать.

  • 7
    Попробовал это. Также не работает - все дороги ведут к 404
4

Так как Laravel 4 - это автозагрузка файлов с карты в статическом файле, вам необходимо обновить этот файл при добавлении нового контроллера. Запустите эту команду для восстановления статического файла:

php composer.phar dump-autoload
3

Я пробовал все это без успеха, тогда я нашел еще одно сообщение и изменил свой .htaccess на это:

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [L]
</IfModule>
  • 0
    идеально. На самом деле я забыл скопировать .htaccess в мой корневой каталог
3

Довольно ясно, что проблема возникает из-за "mod_rewrite", в некоторых случаях достаточно включить этот модуль в Apache, чтобы устранить его.

Однако в моем случае мне пришлось расширить конфигурацию для VirtualHost следующим образом:

<VirtualHost *:80>

    ServerName adplus.local

    ServerAdmin [email protected]
    DocumentRoot /var/www/adplus.local/project/public

    **<Directory "/var/www/adplus.local/project/public">
        AllowOverride All
    </Directory>**

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3

У меня была эта проблема (в Windows с установленным вручную Apache 2.2), и причиной было отсутствие AllowOverride в моем VirtualHost, поскольку корневой каталог в httpd.conf по умолчанию был равен None.

FileInfo Options=MultiViews - минимальный набор, необходимый для Laravel.htaccess

например.

<VirtualHost *:80>
    DocumentRoot "C:/htdocs/domain.com/laravel/public"
    ServerName foo.domain.com

    <Directory "C:/htdocs/domain.com/laravel/public">
        AllowOverride FileInfo Options=MultiViews
    </Directory>
</VirtualHost>

Или используйте AllowOverride All, если это не работает, и вы не заботитесь о безопасности.

2

Перейдите к

nano/etc/nginx/sites-available/yoursite

найдите файл try_ и замените, как показано ниже:

try_files $uri $uri/ /index.php?$query_string;

2

В предыдущем ответе был небольшой недостаток. Это может помочь.

$ sudo a2enmod rewrite
$ sudo service apache2 restart

Надеюсь, он это сделает.

2

Это похоже на @GaryJ и @MartinGomez. Это содержимое .htaccess, которое должно быть установлено в общедоступной папке для всех ваших проектов laravel 4, запущенных на сервере Apache:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteBase /

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
1

Для пользователей Nginx вы, вероятно, скопировали виртуальный хост default, но Laravel требует некоторой настройки в директиве location, чтобы позволить приложению Laravel выполнять маршрутизацию, а не Nginx.

В /etc/nginx/sites-available/your-site-name замените директиву местоположения следующим:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

Затем запустите sudo service nginx reload, чтобы изменения вступили в силу.

0

У меня была аналогичная проблема на Ubuntu 14.04 с Lumen 5.4.

Решение было для меня двумя частями. Сначала в моем файле vhost /etc/apache2/sites-enabled/my_vhost.conf мне пришлось добавить следующую запись <Directory>, чтобы разрешить переопределения после объявления моего DocumentRoot:

    DocumentRoot /var/www/path/to/my/app/public

    <Directory "/var/www/path/to/my/app/public">
            Options FollowSymLinks
            AllowOverride All

            Order allow,deny
            Allow from all
    </Directory>

Затем мне пришлось включить перезаписывание с помощью

sudo a2enmod rewrite
sudo service apache2 restart
  • 0
    Это отлично сработало для меня. Спасибо!
0

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

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

Route::get('login', function () {
return view('login');
});

Но не работал, поэтому я попробовал все, что нашел во всех связанных сообщениях, но этого было недостаточно для решения моей проблемы, поэтому я нашел эти строки на httpd.conf:

<Files ".ht*">
Require all denied
</Files>

Итак, я изменил "denied" на "предоставленный", а также прокомментировал эту строку на моем .htaccess:

#RewriteBase /

И работает! Я думаю, что эти строки заставляют Apache не рассматривать файл .htaccess вашего проекта, поэтому превращение его в предоставленное давало разницу. Надеюсь, это поможет кому-то с той же проблемой.

Работа с Apache Server 2 @Manjaro Linux (на основе Archlinux)

0

Это обновление работало для меня. В файле .htaccess просто добавьте следующее после включения Rewriterules.

Options -Indexes
Options +FollowSymLinks

Работает как шарм

Ещё вопросы

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