Laravel 5路线和mod_rewrite

时间:2016-04-29 16:01:20

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

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

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

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

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

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

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

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

有人可以对此有所了解吗? 为什么我的请求没有达到routes.php(甚至没有显示语法错误),而是返回了404页面。为什么mod_rewrite使它工作? /怎样才能到达route.php,但/users例如{{1}}没'?吨

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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

您可能还希望尝试以下操作:

AllowOverride All

此指令依赖于FallbackResource /index.php 而非mod_dir回退到mod_rewrite而不是抛出404.默认情况下,此模块通常会启用。