Laravel 4除主页以外的所有路由都会导致404错误

73

我使用Composer安装了Laravel 4并设置了虚拟主机。目前只有根路由可用:

<?php

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

我想访问的是位于 /tasksTasksController

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

我也遇到了404错误,我可能做错了什么? 我的项目根目录下有一个默认的.htaccess文件:

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

我正在使用 Mac 上的本地主机。


7
Amit问:你解决了上面的问题吗?如果是,能否请你发布你的解决方案,因为我在我的laravel项目中遇到了同样的问题。提前感谢。 - Om3ga
@AmitErandole 哎呀,我们好像错过了你发布在gist.github.com/4131966上的要点。 - itsazzad
19个回答

117

只是为了好玩,看看/index.php/hello是否有效。

如果有效,那很可能是.htaccess的问题。


2
糟糕!/index.php/hello 可以工作,但是/index.php/tasks 现在给了我一个500错误。什么鬼?我会更新我的问题并附上htaccess内容。 - Amit Erandole
1
我不明白:我已经启用了mod rewrite,并且AllowOverride也设置为All。 - Amit Erandole
2
检查.htaccess文件中是否有任何内容正在运行-如果您正在运行Apache 2.4,请注意与以前版本有关的更改,包括在虚拟主机上的<Directory />...</Directory>块中的Require all grantedAllowOverride all。然后重启Apache以获得好运。 - GaryJ
可能不是。我在哪里找到这行代码? - Amit Erandole
请帮忙吗?我已经设置了相同的虚拟主机(显然不同的DocumentRoot),我还清空了(并尝试删除了).htaccess文件,并在我的主要httpd.conf文件中包含conf/extra/httpd-vhots.conf。我到达了Amit说laravelbackbone.dev指向他的Sites文件夹根目录的地步,但是我得到了一个坏请求。请参见我的问题:http://stackoverflow.com/questions/18859352/laravel-4-routing-not-working-due-to-htaccess-file - marienke
显示剩余8条评论

40

在Windows 8上运行Laravel 4时遇到了同样的问题。
对我有效的解决方案是:

  1. 打开apache httpd.conf文件,找到以下行:

#LoadModule rewrite_module modules/mod_rewrite.so
  • 取消注释此行(删除#
  • 保存httpd.conf
  • 重启WAMP
  • 这样就应该可以正常工作了!


    我在我的httpd.conf中没有#LoadModule rewrite_module modules/mod_rewrite.so :( 这是Windows8的问题吗?我在Windows7上使用XAMPP - marienke
    13
    在Ubuntu上,这将是:sudo a2enmod rewrite,然后是sudo service apache2 restart - Jeff Lambert
    完美!这解决了我的问题。 - Captain Hypertext
    我只想补充一点,您可能需要在httpd.conf中将“AllowOverride FileInfo”设置为目录,或者将重写指令移动到该目录段并放弃“.htaccess”文件。 - hanzo2001

    30

    我曾经遇到过同样的问题,解决方法是在Apache2上启用rewrite模块。

    在终端中使用以下命令:

    $ sudo a2enmod rewrite
    $ sudo service apache2 restart
    

    并且,魔法!


    你和 @GaryJ 救了我的一天!谢谢。 - markov00
    工作正常,谢谢。 - Husam
    你可以先检查 mod_rewrite 是否已启用。 - Chandan Sharma

    20

    我遇到了完全相同的问题。

    1. 在Apache中启用rewrite_module
    2. AllowOverride从None更改为All,例如(Apache 2.4.9):

    3. <Directory "c:/www">
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Require all granted
      </Directory>
      

    供参考:
    使用 Laravel Homestead、VirtualBox 和 Vagrant 而非 WAMP。Homestead 包含 Nginx 而非 Apache,但默认配置专为 Laravel 设计,因此一切都可以正常工作。


    当我在服务器上部署时,这对我很有效。Vagrant是一个不错的建议,更明确地说,如果你想坚持使用Apache,我建议使用http://laravel.com/docs/4.2/homestead或https://box.scotch.io/。 - Luca
    AllowOverride在我新安装的xampp和虚拟主机中有效。 - Can Tecim
    我曾经遇到过完全相同的问题。我也执行了针对Apache的“sudo a2enmod rewrite”命令,然后在apache2.conf文件中将AllOverride从None更改为All。 - Richard Chassereau

    16

    对于Ubuntu用户 - 在Ubuntu 18.04上进行了测试

    1- 启用mod rewrite

    sudo a2enmod rewrite
    

    2- 更改Apache配置文件中的AllowOverride:

    sudo nano /etc/apache2/apache2.conf
    

    在此块中将AllowOverride从None更改为All

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

    3- 重新启动Apache

    sudo service apache2 restart
    

    1
    也可以在 Laravel 5.1 上工作。太好了! - Janaka Dombawela
    1
    在Ubuntu 20上使用Laravel 8非常顺畅。谢谢! - Fakher
    在Ubuntu 18和Laravel 8中完美运行。有人知道原因吗? - Carlos Laspina

    12
    即使启用了mod_rewrite,如果您将laravel/public文件夹别名化,仍可能遇到此问题。
    添加
    RewriteBase /your_apache_alias
    

    使用 .htaccess 就可以解决这个问题。


    我遇到了相同的问题,使用Ubuntu服务器14.04。在apache2.conf中使用别名,mod_alias已经启用。将rewritebase添加到公共文件夹中的.htaccess文件中解决了问题。谢谢! - Frendhi
    谢谢,就是这样! - Paranoid Android

    9

    我尝试了所有这些方法,但都没有成功,后来我找到了另一篇帖子,并将我的.htaccess更改为以下内容:

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

    实际上,我忘记将 .htaccess 文件复制到我的根目录中。 - Abhishek Goel

    6
    您不需要在定义home以外的任何内容时使用 / :
    Route::get('hello', function()
    {
        return View::make('hello');
    });
    

    应该可以工作。


    5

    就像@GaryJ和@MartinGomez所说的那样。这是应该设置在Apache服务器上运行的所有Laravel 4项目的public文件夹中的.htaccess内容:

    <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
    天哪..在尝试了其他所有可能的方法数小时后,这是唯一有效的方法。我正在使用Laravel 7...运行一些Laravel应用程序和安装过程真是噩梦。如果调试打开,我希望他们能有更好的错误处理方式来让人们知道页面上出了什么问题。也许是因为我正在安装一个较旧的Laravel应用程序。看起来这是一个非常困难的过程。 - Scott Yu - builds stuff

    4

    之前的回答有一点小瑕疵,这里提供一个更好的解决方案。

    $ sudo a2enmod rewrite
    $ sudo service apache2 restart
    

    希望它能够正常运行。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接