【问题标题】:Laravel 5 routes and mod_rewriteLaravel 5 路线和 mod_rewrite
【发布时间】:2016-08-24 21:10:14
【问题描述】:

我有一个简单的routes.php 文件,如下所示:

Route::group(['middleware' => 'cors', 'prefix' => 'api'], function () {
  Route::post('users', 'Api\UsersController@save');
  Route::get('users/{userId}/leagues/', 'Api\UsersController@saveFavoriteLeague');
});

一旦我将我的应用程序放到服务器上,我就无法访问任何已执行的路由。我遇到了 404 异常。

我试图通过将123 放在文件顶部来在routes.php 文件中犯一个明显的错误。然后我点击mydomain.com/users/1/leagues,我期待错误页面,有语法错误,但没有发生(仍然得到 404)。 但是,当添加这样的内容时:

Route::get('/', function() {
   return 'Hello';
});

然后点击主路由mydomain.com,我首先看到了语法错误,然后在修复它之后,Hello

我花了几个小时才发现远程服务器上没有启用 mod_rewrite。

有人可以对此进行更多说明吗? 为什么我的请求没有到达routes.php(甚至没有显示存在语法错误),而是返回了 404 页面。为什么 mod_rewrite 让它工作? / 怎么可能到达 route.php,但是 /users 例如没有?

谢谢!

【问题讨论】:

    标签: apache .htaccess mod-rewrite laravel-5 routing


    【解决方案1】:

    当您向文档根目录(在您的情况下为/)发出请求时,Apache 将查找所谓的DirectoryIndex - 发出此类请求时加载的默认文件。通常,此索引文件为 index.phpindex.html,或者由服务器配置或覆盖文件 (.htaccess) 设置。

    在您的情况下,请求 / 将默认提供 index.php - 这是 Laravel 的引导程序,并执行启动应用程序所需的初始步骤。其中一部分包括获取您的路线并对其进行处理。

    但是,当您请求 /something 并且 mod_rewrite 未启用(或您的 .htaccess 文件未被读取,因为 AllowOverride 未设置为 All)时,Apache 将不会尝试提供 @ 987654333@,因为它知道正在发出特定请求。由于您的文档根目录中不存在/something,因此 Apache 将抛出 404。

    因此,您需要确保启用了mod_rewrite(在您的终端中输入sudo a2enmod rewrite,或与您的托管服务提供商联系),并确保您的虚拟主机或默认站点配置已将AllowOverride All 设置为文档根目录。

    您可能还想尝试以下方法:

    FallbackResource /index.php
    

    此指令依赖mod_dir 而不是mod_rewrite 来回退到index.php 而不是抛出404。此模块通常默认启用。

    【讨论】:

    • 所以,如果我做对了,如果 'mod_rewrite' 未启用,apache 将不会提供 'index.php' 和引导程序 'routes.php' (当遇到任何不同的 '/' )?我需要阅读有关 mod_rewrite 的更多信息,谢谢您的回答。
    • 确实如此。请记住routes.phpmod_rewrite 无关。他们这里的关键是index.php,它只会在请求/时提供。
    猜你喜欢
    • 2015-12-11
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2015-12-24
    • 2016-07-03
    相关资源
    最近更新 更多