2014-09-25 94 views
0

我使用Laravel-4 在当前项目中,我有一个管理页面访问静态文件

Route::get('/admin', function() { 
    return View::make('admin.admin'); 
})->before('admin.auth'); 

本页面已经embbed 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由“admin.auth”过滤器保护。 但是每个人都可以通过URL访问admin.swf文件mysite.com/misc/admin/admin.swf

保护'admin.auth'过滤器直接访问静态管理文件的最佳方式是什么?

回答

1

我afrait这将是非常困难的,因为它不是Laravel这是给你访问特定的文件,但您的Web服务器(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') 

因此,如果您需要更改标题,您可以。

+0

Tnanks的答案。我尝试了这种方法,但是我看到的是白色块,而不是Flash电影。单击鼠标右键显示flash player上下文菜单“Movie not loaded” 我想Response :: download会设置错误的HTTP标头。 – terbooter 2014-09-25 19:10:17

+0

经过编辑可显示放置正确标题的位置。 – 2014-09-25 20:14:01

+0

我解决了它。 :)要设置正确的标题,需要将最后一个参数从'attachment'改为'inline' – terbooter 2014-09-25 20:40:28

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使用响应的另一变型::下载

Route::get('/admin.swf', function() { 
    $file = dirname(app_path()) . "/private/admin.swf"; 
    return Response::download($file, '', [], 'inline'); 
})->before('static.auth');