laravel 5 只有根路由有效

Posted

技术标签:

【中文标题】laravel 5 只有根路由有效【英文标题】:laravel 5 only root route works 【发布时间】:2015-10-04 18:45:51 【问题描述】:

我是 laravel 的新手。我正在使用 Ubuntu 15.04。我使用 composer 安装了 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('/', 'PagesController@index');

Route::get('about', 'PagesController@about');

Route::get('hello', 'PagesController@hello');

每当我转到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/hellohttp://localhost:63342/my-first-app/public/about时,我得到的是404 Not Found消息。

另外,位于my-first-app/public.htaccess 文件看起来像这样:

<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/hellohttp://localhost:63342/my-first-app/public/index.php/about,但也没有用。 我输入了命令sudo a2enmod rewrite,然后输入了sudo service apache2 restart,但它也不起作用。 我试过composer dump-autoload,但也没用。

我在apache2.conf 中将AllowOverrideNone 更改为All。现在它的一部分看起来像这样:

<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>

但它也不能解决问题。

更新(2015 年 7 月 15 日):

运行php artisan route:list的结果如下:

+--------+----------+-------+------+--------------------------------------------+------------+
| Domain | Method   | URI   | Name | Action                                     | Middleware |
+--------+----------+-------+------+--------------------------------------------+------------+
|        | GET|HEAD | /     |      | App\Http\Controllers\PagesController@index |            |
|        | GET|HEAD | about |      | App\Http\Controllers\PagesController@about |            |
|        | GET|HEAD | hello |      | App\Http\Controllers\PagesController@hello |            |
+--------+----------+-------+------+--------------------------------------------+------------+

【问题讨论】:

运行“php artisan route:list”并粘贴输出。您应该在那里看到所有已定义的路线。 @jedrzej.kurylo 感谢您的回复。我在问题的末尾添加了结果。 你能添加 dd('test');在索引文件的顶部,转到“localhost:63342/my-first-app/public/index.php/about”,看看是否会输出测试?这样我们就可以知道是重写还是 Laravel 代码 @jedrzej.kurylo 我在index.php 文件的顶部添加了dd('test');。现在,当我转到 http://localhost:63342/my-first-app/public/index.php 时,它会显示一个空白页面,而当我转到 http://localhost:63342/my-first-app/public/index.php/about 时,它会给我同样的 404 Not Found 消息。 您能否在您的控制台中运行php artisan serve --port 8000 --host 127.0.0.1(可能是终端,因为您在Linux 中)然后导航到http://localhost:8000/about 并告诉我们会发生什么?另外,请记住您可能必须在您的 lampp 上启动您的 apache 服务器。 【参考方案1】:

启用 apache2 重写模块:

sudo a2enmod rewrite

然后重启apache2服务器:

sudo service apache2 restart

并确保 AllowOverride All 到您的 apache2 配置文件。

【讨论】:

这是linux最简单的方法。这个对我有用。谢谢【参考方案2】:

这个烦人的问题困扰我很久了。打开公用文件夹中的.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>

【讨论】:

非常感谢分享这个解决方案。它对我有用。【参考方案3】:

第 1 步:启用 mod_rewrite

sudo a2enmod 重写

第 2 步:要激活这些更改,请重新启动 Apache2

sudo service apache2 重启

现在检查您的网页是否正常工作。 如果不按照第 3 步操作。

第 3 步:编辑 Apache 配置文件

要编辑运行以下命令:

sudo nano /etc/apache2/sites-available/000-default.conf

然后在&lt;VirtualHost *:80&gt;下面添加以下代码块

<Directory /var/www/html>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>

保存文件并退出。

重启apache2:

sudo service apache2 重启

现在应该可以正常使用了。

【讨论】:

我更新了你的答案以包含 ReWriteEngine On 只是为了更好的衡量【参考方案4】:

根据 laravel 5 官方文档,在这种情况下更改 .htaccess 文件将起作用,如下所示:

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

【讨论】:

【参考方案5】:

大多数时候初学者不会在他们的项目中创建.htaccess文件,请确保从公共文件夹中复制.htaccess文件并将其粘贴到项目的根目录中...

【讨论】:

以上是关于laravel 5 只有根路由有效的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Laravel 路由,默认根路由除外

POST 路由未从根路径 Laravel 5.2 中列出

Laravel 5.5:PHPUnit(带覆盖)不喜欢来自多个文件的路由并抛出“尚未设置外观根”。没有报道它是绿色的

laravel5.5源码阅读草稿——路由

Laravel 路由问题:自动重定向到根文件夹

Laravel 根路由“/”在子域的前缀路由中不起作用