在 Laravel 4 中给出 403 Forbidden 错误的单一路线

Posted

技术标签:

【中文标题】在 Laravel 4 中给出 403 Forbidden 错误的单一路线【英文标题】:Single route giving a 403 Forbidden error in Laravel 4 【发布时间】:2014-09-18 10:05:56 【问题描述】:

过去几天我一直在试图弄清楚为什么会发生这种情况,但没有成功。我在 Laravel 中路由时发现了一些其他处理 403 错误的问题,但没有一个问题与单个路由的问题有关。 Laravel 和 Web 开发有点新,所以可能会遗漏一些明显的东西,但这里是:

所以我项目中的路由都可以工作,除了一个路由是 mywebsite/admin,它给我一个 403 错误。当我访问 mywebsite/index.php/admin 时,它确实工作。我不明白为什么我的其他路线都没有同样的问题。例如,mywebsite/test 有效,mywebsite/admin/categories 有效。从字面上看,这是唯一行不通的路线。另外值得注意的是,在我的本地服务器和生产服务器(使用 Laravel Forge 的 Digital Ocean)上尝试访问它时会出现同样的问题。

这是我的 routes.php 文件:

Route::get('/', function()

    return View::make('hello'); //works
);

Route::get('/admin', function()

    return "admin"; //403 error
);

Route::get('/test', function()

    return "test"; //works
);


//these all work
Route::get('/admin/dashboard', 'TaskCategoriesController@showAdmin');

// all category routes
Route::get('/admin/categories/', 'TaskCategoriesController@show');
Route::get('/admin/categories/id/edit', 'TaskCategoriesController@edit');
Route::post('/admin/categories/id/edit/', array('uses' =>    'TaskCategoriesController@update'));
Route::post('/admin/categories/create/id', array('uses' => 'TaskCategoriesController@create'));
Route::get('/admin/categories/delete/id', array('uses' => 'TaskCategoriesController@delete'));

Route::get('/admin/categories/create', function()

    return View::make('CreateCategory');
);

// all form routes
Route::get('/admin/forms/id/edit', 'TaskFormsController@edit');
Route::post('/admin/forms/id', 'TaskFormsController@create');
Route::post('/admin/forms/id/submit', 'OrdersController@submitOrder');
Route::get('/admin/forms/id/add', 'TaskFormsController@addFormElement');
Route::get('/admin/forms/id/edit/elementId', 'TaskFormsController@editFormElement');
Route::get('/admin/forms/id/delete/elementId', 'TaskFormsController@deleteFormElement');
Route::post('/admin/forms/id/saveUpdates/tid', 'TaskFormsController@updateFormElement');


//time table routes
Route::post('/admin/categories/id/timetable/date', array('uses' => 'TimeTableController@updateTimetable'));
Route::get('/admin/categories/id/timetable', array('uses' => 'TimeTableController@timetable'));
Route::get('/admin/categories/id/timetable/date', array('uses' => 'TimeTableController@editWeekTable'));

这是我的 .htaccess 文件:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

有人知道为什么会发生这种情况吗?

【问题讨论】:

您的app/public 文件夹中有一个名为admin 的文件夹吗?如果是这样,您将要删除该文件夹。可能会跳过 url 重写,因为目录存在,它会尝试目录列表 app/public/admin 文件夹,但禁止这样做。 @Unnawut 哇,是的。这就是问题所在。非常感谢! 这里也一样...记得清除浏览器缓存,因为浏览器缓存中存在永久重定向! 【参考方案1】:

如果您可以访问 mywebsite/index.php/admin 而其他路由正常,则意味着您的 Laravel 路由和 .htaccess 文件正在运行。

所以问题可能出在 .htaccess 跳过 url rewrite only for url mywebsite/admin,与这三行有关:

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]

如果请求的 url 指向现有文件或文件夹,上面的前两行告诉 apache 不要将 url 重写为 Laravel 的 index.php。它显示 403 Forbidden 的事实很可能是因为 apache 试图列出 /admin 文件夹,但禁止这样做。

因此解决方案是确保您没有文件夹app/public/admin。如果有,请将其删除并重试。

【讨论】:

每当我调用路由 base_url/admin 403 时,我在公用文件夹中有一个名为 admin 的目录,都会发生同样的事情

以上是关于在 Laravel 4 中给出 403 Forbidden 错误的单一路线的主要内容,如果未能解决你的问题,请参考以下文章

Rails,Passenger,Nginx,我得到“403 Forbidden”,但为啥呢?

403 Forbidden on nginx/1.4.6 (Ubuntu) - Laravel

在 Windows 8 的 IIS 8 上使用 .NET 4.5 的 MVC 4 网站给出 403.14 禁止错误 [关闭]

403 从公共/图像文件夹 laravel vuejs xampp 加载图像时禁止

Laravel 403 禁止错误

Kaggle数据集下载