访问静态文件

时间:2014-09-25 18:00:59

标签: laravel laravel-4

我正在使用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;保护对静态管理文件的直接访问的最佳方法是什么?过滤

2 个答案:

答案 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');
相关问题