我正在使用Laravel-4 在当前项目中,我有一个管理页面
Route::get('/admin', function () {
return View::make('admin.admin');
})->before('admin.auth');
此页面已嵌入admin.swf文件
<object type="application/x-shockwave-flash" data="/misc/admin/admin.swf">
<param name="wmode" value="window"/>
<param name="quality" value="high"/>
...
</object>
admin.swf文件位于/project-root/public/misc/admin/admin.swf
我的管理员路线mysite.com/admin受&#39; admin.auth&#39;保护过滤。 但每个人都可以通过URL mysite.com/misc/admin/admin.swf访问admin.swf文件
通过&#39; admin.auth&#39;保护对静态管理文件的直接访问的最佳方法是什么?过滤
答案 0 :(得分:1)
我很难过,因为Laravel不是让你访问那个特定文件,而是你的网络服务器(apache,nginx?)。
Laravel创建一个页面,对该页面中链接的文件的所有其他访问都在此之后完成,作为对web服务器的请求,因此如果您向nginx请求文件并且该文件存在,它将直接将其提供给您的浏览器,否则它会将调用重定向到index.php。
您可以告诉nginx禁止访问该文件夹:
location ~ /misc/admin/ {
deny all;
return 404;
}
但是你必须创建一个路线和一个类来为你的文件提供服务:
Route::get('/admin/download/{fileName}', ['as' => 'admin.download', function ($fileName)
{
return Response::download($fileName);
}])->before('admin.auth');
这个download
方法已经存在于您的Laravel中,因此,它没有经过测试,但它应该按原样运行。
然后你只需要引用你的文件
<object type="application/x-shockwave-flash" data="{{ URL::route('admin.download', ['admin.swf']) }}">
<param name="wmode" value="window"/>
<param name="quality" value="high"/>
</object>
请注意,这是一个很慢的操作,因为Laravel会一次又一次地为您的页面必须下载的每个文件启动。如果你只有一个文件,它应该没问题,但是,例如,一个照片库,渲染整页需要花费很多时间。
编辑:
这是下载方法声明:
public static function download($file, $name = null, array $headers = array(), $disposition = 'attachment')
因此,如果您需要更改标题,则可以。
答案 1 :(得分:0)
1。 我将admin.swf文件放到 /project-root/private/admin.swf 我认为这比更改Web服务器配置以限制公共访问更好。
2。 我做了以下路线
Route::get('/admin.swf', function () {
$file = dirname(app_path()) . "/private/admin.swf";
return Response::make(File::get($file), 200, [
'Content-Type' => 'application/x-shockwave-flash'
]);
})->before('admin.auth');
现在只有在授权后才能访问文件。
PS 使用Response :: download
的另一种变体Route::get('/admin.swf', function () {
$file = dirname(app_path()) . "/private/admin.swf";
return Response::download($file, '', [], 'inline');
})->before('static.auth');