Laravel 5 работает только с корневым маршрутом

Я новичок в laravel. Я использую Ubuntu 15.04. Я установил Laravel Framework версии 5.1.7 (LTS), используя композитор и сервер ламп, используя команду $ sudo apt-get install lamp-server^ (я не установил Homestead). Я использую PhpStorm 8.0.3 как IDE.

Я создал три маршрута и контроллер. Файл PagesController.php выглядит следующим образом:

class PagesController extends Controller
{
    public function index()
    {
        return 'Welcome to my homepage!';
    }

    public function about()
    {
        return 'Learn a little about me.';
    }

    public function hello()
    {
        return 'Hello World!';
    }
}

и routes.php выглядит следующим образом:

Route::get('/', '[email protected]');

Route::get('about', '[email protected]');

Route::get('hello', '[email protected]');

Всякий раз, когда я иду на http://localhost:63342/my-first-app/public/ (или http://localhost:63342/my-first-app/public/index.php), он отлично работает и показывает мне сообщение Welcome to my homepage!. Но всякий раз, когда я перехожу к http://localhost:63342/my-first-app/public/hello или http://localhost:63342/my-first-app/public/about, я получаю сообщение 404 Not Found.

Кроме того, файл .htaccess, расположенный в my-first-app/public, выглядит следующим образом:

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

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

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

Что я пробовал:

  • Я пробовал http://localhost:63342/my-first-app/public/index.php/hello или http://localhost:63342/my-first-app/public/index.php/about, но он тоже не работает.
  • Я ввел команду sudo a2enmod rewrite, за которой следует sudo service apache2 restart, но она также не работает.
  • Я пробовал composer dump-autoload, но он тоже не работает.
  • Я изменил AllowOverride с None на All в apache2.conf. Теперь часть его выглядит следующим образом:

    <Directory />
        Options FollowSymLinks
        AllowOverride All
        Require all denied
    </Directory>
    
    <Directory /usr/share>
        AllowOverride All
        Require all granted
    </Directory>
    
    <Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    <Directory /srv/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    

    но он также не решает проблему.

Обновление (7/15/2015):

Результат работы php artisan route:list выглядит следующим образом:

+--------+----------+-------+------+--------------------------------------------+------------+
| Domain | Method   | URI   | Name | Action                                     | Middleware |
+--------+----------+-------+------+--------------------------------------------+------------+
|        | GET|HEAD | /     |      | App\Http\Controllers\[email protected] |            |
|        | GET|HEAD | about |      | App\Http\Controllers\[email protected] |            |
|        | GET|HEAD | hello |      | App\Http\Controllers\[email protected] |            |
+--------+----------+-------+------+--------------------------------------------+------------+

Ответ 1

У меня была эта досадная проблема в течение долгого времени. Откройте файл .htaccess в общей папке и замените и вставьте следующий код, сделайте резервную копию исходного кода на всякий случай.

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

    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/index.php [L]

</IfModule>

Ответ 2

Изменение файла .htaccess будет работать в этом сценарии на одном официальном документе laravel 5, как показано ниже:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Ответ 3

Включить модуль перезаписи apache2:

sudo a2enmod rewrite

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

sudo service apache2 restart

И убедитесь, что AllowOverride All в вашем конфигурационном файле apache2.