我的路线返回 404,我该如何修复它们


My Routes are Returning a 404, How can I Fix Them?

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

唯一有效的路由是开箱即用地附加到 Laravel 的默认主路由。

我在 Windows 上使用 WAMP,它使用 PHP 5.4.3 和 Apache 2.2.22,我也启用了mod_rewrite,并从应用程序.php配置文件中删除了"index.php"以留下空字符串。

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

class User_Controller extends Base_Controller {
    public $restful = true;
    public function get_index() 
    {
        return View::make('user.index');
    }
}

我在应用程序/视图/用户/中创建了一个名为 index 的视图文件.php其中包含一些基本的 HTML 代码,并且在路由中.php我添加了以下内容:

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

在我的 Web 浏览器中访问根 ( http://localhost/mysite/public( 时,第一个路由工作正常,但是当我尝试使用http://localhost/mysite/public/user转到第二个路由时,我收到 404 未找到错误。为什么会这样?

在我的 Ubuntu LAMP 安装中,我通过以下 2 个更改解决了这个问题。

  1. 在 apache 服务器上启用mod_rewrite:sudo a2enmod rewrite
  2. 编辑/etc/apache2/apache2.conf,更改/var/www 目录(这是我的主文档根目录(的"AllowOverride"指令:AllowOverride All

然后重新启动 Apache 服务器:service apache2 restart

使用 WAMP 单击 wamp icon -> apache -> apache modules -> scroll 并选中rewrite_module

重新启动加载模块rewrite_module

注意:启用"rewrite_module"后,服务器应用程序将自动重新启动

您是否尝试过检查是否

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

在工作吗?如果是这样,请确保所有路径的文件夹没有任何大写字母。我也有同样的情况,将字母转换为小写会有所帮助。

您是否尝试过将其添加到路由文件中而不是Route::get('user', "user@index")

@之前的文本段,user在这种情况下,会将页面定向到用户控制器,@之后的文本段,index,会将脚本定向到user函数public function get_index()

我看到您正在使用$restful,在这种情况下,您可以将Route设置为 Route::any('user', 'user@index') 。这将处理POSTGET,而不是将它们分别写出来。

我在使用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>
您可以

尝试将root/public/.htaccess移动到root/.htaccess,它应该可以工作

只需在终端中运行即可。

php artisan route:clear

路线

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

控制器

当您想使用传统的 MVC 架构时,请使用它们

解决您的问题

不要将控制器注册为路由,除非需要控制器操作的特定"命名"路由。

无需为控制器操作创建路由,只需注册控制器:

Route::controller('user');

现在您的控制器已注册,您可以导航到http://localhost/mysite/public/user,您的get_index将运行。

您还可以一次性注册所有控制器:

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

好的,所以在这个问题上抨击了一天多一点之后......我起床做了我昨天应该做的事情,并调试了正在发生的事情!

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文件夹中的方便.htaccess文件中提供了正确的重写规则。问题是,".htaccess"文件中的代码不适用于开箱即用的 WAMP 配置方式。造成这种情况的原因似乎是 muvera 在此线程顶部提出的问题——rewrite_module代码需要由 Apache 加载,然后RewriteRule的东西才能工作。哎呀,这是有道理的。

没有意义的部分:简单地stoppingrestarting Apache 服务不会接受 WAMP 使用您的 RewriteRule 做正确事情所需的更改——我知道,我尝试了很多次!

什么有效:进行muvera建议的更改(见线程顶部(以加载正确的模块。然后,重置整个Windows会话,从而将Apache完全从内存中转储出来。重新启动(重新加载(WAMP,瞧!修复有效,应用了正确的重写规则,亚达,亚达;从此我过上了幸福的生活。

好消息

是:我现在对.htaccessRewriteRulehttpd.conf文件有了更多的了解。有一个很好的(性能(参数可以将逻辑从应用程序的public .htaccess文件中移出,并将其放入 Apache 'bin' 文件夹中 httpd.conf 的Directory ...部分(特别是如果您有权访问该文件夹(。

不要忘记

public/.htaccess中的RewriteBase

例如:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

尝试在 php.ini 中启用短 php 标签。WAMP通常会关闭它们,而Laravel需要它们。

你必须使用Laravel 5

命令
  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

和路线.php

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

视图和控制器的 Laravel 5 命令更改请参阅我之前遇到相同错误的文档

只需在终端中运行即可。

 composer dump-autoload
<</div> div class="answers">

我认为您已经删除了 laravel 公共文件夹中的默认 .htaccess 文件。 上传文件应该可以解决您的问题。

简单的命令自动加载依赖项

composer dump-autoload

并且仍然得到您的一些重要文件丢失,所以去这里查看整个过程

https://codingexpertise.blogspot.com/2018/11/laravel-new.html

如果您通过 Homestead 使用流浪者,则可能是挂载共享文件夹时出错。看起来Vagrant从该文件夹中获取您的文件,并在启动时交换出主机上的实际文件,因此,如果出现错误,您实际上是在尝试从您第一次进行安装时访问Laravel安装(这就是为什么您只得到"家" - 这是在安装过程中生成的(。

可以通过 sshing 连接到 vm 并检查路由/web.php 文件以查看它是否确实是你的文件来轻松检查这一点。如果不是,请退出并vagrant haltvagrant up 并在启动时查找错误。

  1. 安装 .env 文件
  2. 配置index.html
  3. 确保您有.htaccess
  4. sudo service apache2 restart

很可能是由于缓存问题

路由

不起作用的主要问题是macOS中有mod_rewrite.so模块,在Apache配置的httpd.conf文件中未启用Linux,因此.htaccess可以工作。我已经通过取消注释该行来解决此问题:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

从上面的httpdf.conf行中删除#。然后它将工作.
享受!

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

将上面更改为

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

您必须在路线末尾使用'/'(home/default)