在 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 禁止错误 [关闭]