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.