我的路由返回404错误,我该如何修复?

90

我刚开始学习Laravel框架,但是在路由方面遇到了问题。

唯一能工作的路由是Laravel默认提供的主页路由。

我在Windows上使用WAMP,它使用的是PHP 5.4.3和Apache 2.2.22,我同样也启用了mod_rewrite,并已将应用程序的config文件中的“index.php”删除,以留下一个空字符串。

我创建了一个名为User的新控制器:

class User_Controller extends Base_Controller {
    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

我已经在application/views/user/中创建了一个名为index.php的视图文件,并添加了一些基本的HTML代码,在routes.php文件中添加了以下内容:

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

当我在浏览器中访问根路由 (http://localhost/mysite/public) 时,第一条路由能够正常工作,但是当我尝试访问第二条路由 http://localhost/mysite/public/user 时,会收到404 Not Found错误。为什么会发生这种情况呢?


".htaccess" 文件未被修改,就像它刚开始时一样。 - JasonMortonNZ
看起来WAMP是问题所在。现在已经更换为XAMPP,一切都很好,正常运行。我应该自己回答这个问题并解释WAMP是问题所在吗? - JasonMortonNZ
@AquilaSolutions 是的,你可以这样做。这样每个人都能清楚地看到你的问题已经解决了。 - Jocelyn
19个回答

144
在我的Ubuntu LAMP安装中,我通过以下两个更改解决了这个问题。
  1. 在apache服务器上启用mod_rewrite: sudo a2enmod rewrite
  2. 编辑/etc/apache2/apache2.conf文件,更改/var/www目录(我的主文档根目录)的"AllowOverride"指令:AllowOverride All
然后重新启动Apache服务器:service apache2 restart

这对我在从puphpet下载的vagrant虚拟机上解决了这个问题。 - winkbrace
在使用 Laravel-5.4 的 MacOS High Sierra 10.13.3 上对我有效。 - Yevgeniy Afanasyev
2
@McSonk,可能问题是关于Windows的。这个替代方案适用于Ubuntu。谢谢老兄。 - Fendi Septiawan
apache2的配置文件似乎比虚拟主机文件更具优先级。如果您在虚拟主机文件中有“AllowOverride All”,则网站可能会使用您在apache配置文件中设置的任何值。 - sdexp
如果你有本地的Apache或虚拟机,那是一个很好的答案。但在现实生活中,您的网站在托管时,您无法访问Apache配置文件。必须有其他解决方案。 - Alberto Torre

63
使用WAMP,单击wamp图标,选择apache,再选择apache modules,向下滚动并勾选rewrite_module。 重新启动LoadModule rewrite_module。 注意:启用“rewrite_module”后,服务器应用程序将自动为您重启。

非常感谢,我昨天以来一直在尝试解决这个问题。 - Moe
2
每次我在电脑上安装/重新安装WAMP和Laravel时,似乎都会发生这种情况。这总是问题所在。希望最终能记住它 ;) - Kenmore
在Ubuntu 14.04下,执行'sudo a2enmod rewrite'和'sudo service apache2 restart'命令即可。 - nspo
对于Linux系统,请启用重写模块sudo a2enmod rewrite,然后重新启动sudo service apache2 restart - aimme

38

你是否尝试过检查

http://localhost/mysite/public/index.php/user 

你是在工作吗?如果是,请确保您路径中的所有文件夹都没有任何大写字母。我遇到了相同的情况,将字母转换为小写有所帮助。


谢谢。我正在逐步阅读 Laravel 书籍(Laravel 入门),在路由到闭包(第13页)时遇到了困难。这解决了我的问题。 - Steve Lindsey
这解决了我的问题。我在我的Apache文件夹的根目录下有一个.htaccess文件,它破坏了Laravel的htaccess。 - Maarten00
这解决了我遇到的另一个问题。在Windows上使用Laravel生成页面,并使用Angular调用REST时,对于api/branches的调用有效,但在Linux上,我必须将此URL更改为:index.php/api/branches。有没有办法解决这个问题,使得URL保持一致? - miroslavign
我从未想过它是区分大小写的。 - ClearBoth
将 public/ 文件夹中的 .htaccess 文件移动到项目根目录,然后您可以通过 http://localhost/mysite/user 访问。 - Rohan Khude
我将所有路径都设置为小写,但仍然无效。/public/index.php/user可用,而/public/user返回404。 - Alberto Torre

25

你尝试过将以下内容添加到路由文件中吗?Route::get('user', "user@index")

@之前的文本,在这个例子中是user,将页面定向到用户控制器;@之后的文本index将脚本定向到user函数public function get_index()

我看到你正在使用$restful,这种情况下,你可以将你的Route设置为Route::any('user', 'user@index'),它会处理POSTGET,而不是单独编写它们。


我从WAMP切换到XAMPP,因为问题仍然存在。在XAMPP服务器上启动一个新项目,并使用“@”符号代替“.”,现在它运行得非常好。 - JasonMortonNZ
1
它在WAMP上运行良好,您只需要启用rewrite_module。请参见@Muvera下面的评论。 - ajon
3
我知道这是一篇旧答案,但我遇到了类似的问题:新路由添加后无法使用(404)。我只需要清除缓存的路由!可以使用php artisan route:clear命令。 - trainoasis

9
我在使用EasyPHP时遇到了同样的问题。发现我需要在httpd.conf中的<Directory>块中指定AllowOverride All。如果没有这个设置,Apache有时会忽略你的.htaccess文件。
我的设置最终看起来像这样...
<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>

我发现在Debian GNU/Linux 7.6上,这个响应提供了部分所需内容,除此之外还需要启用apache2模块(a2enmod rewrite)。 - Kevin Buchs

7

只需在你的终端中运行即可。

php artisan route:clear

6
你可以尝试将root/public/.htaccess移动到root/.htaccess,这样应该可以解决问题。

4
你在8个问题中都发布了完全相同的答案。如果你认为这些问题是重复的,应该将它们标记为重复,而不是对每个问题都发表答案。 - Jaap

5

路由

使用它们来定义不由控制器管理的特定路由。

控制器

当您想要使用传统MVC架构时使用它们。

解决方案

除非您需要特定的“命名”控制器操作路由,否则不要将控制器注册为路由。

与其为控制器操作创建路由,不如直接注册控制器:

Route::controller('user');

现在你的控制器已经注册成功,你可以访问 http://localhost/mysite/public/user,并且你的get_index方法将被执行。

你也可以一次性注册所有控制器:

Route::controller(Controller::detect());

4

好的,经过一天多的苦思冥想...我终于做到了昨天应该做的事情,并进行了调试!

Laravel这里试图做的是,在给定的路由路径之前插入文件index.php。例如,如果您指定了一个Route::get('/account/create', ...,并且从浏览器上执行您的应用程序,如在localhost/laravel/authenticate/public/account/create中,则Laravel希望执行localhost/authenticate/public/index.php/account/create,但要做到这一点......Apache需要看到通过/wamp/www/laravel/laravel/authentication/public(您的路径可能略有不同,具体取决于您的Laravel应用程序实际安装的位置,但尾随的public是替换需要发生的地方)必须应用'RewriteRule'。

值得庆幸的是,Laravel在应用程序的public文件夹中提供了正确的Rewrite规则的方便.htaccess文件。问题是,该'.htaccess'文件中的代码不能与WAMP默认配置的方式一起工作。原因似乎是本线程最上面所提出的问题--在RewriteRule的东西起作用之前,必须由Apache加载rewrite_module代码。这很有道理。

不合乎逻辑的部分是:简单地停止重启Apache服务不会获得WAMP进行正确配置的必要更改--我知道,我尝试了很多次!

有效的方法是:根据muvera(参见本主题顶部)建议进行更改以加载正确的模块。然后,重置您的整个Windows会话,从而完全将Apache退出内存。重新启动(重新加载)WAMP,美妙之处!解决方案有效,应用正确的RewriteRule,等等;我过上了幸福生活。

所有这些好消息:我现在对.htaccessRewriteRulehttpd.conf文件有了更多的了解。通过将逻辑从您的应用程序的public.htaccess文件中移动并将其放入Apache 'bin'文件夹中的Directory ...部分中(特别是如果您可以访问该文件夹),有一个很好的(性能)论点。


3
不要忘记在你的public/.htaccess文件中设置RewriteBase
例如:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

1
你把这放在文件的哪里? - Goddard

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