3

我正在使用 Laravel (ocotber CMS) 开发我的项目,并使用Spatie URL Signer包来保护我的具有有限生命链接的文件。我将文件上传到按.htaccess文件列入黑名单的受保护目录。

我的.htaccess: RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]

我的文件上传到: /storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf

生成具有到期日期的链接的代码: UrlSigner::sign('http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf');

生成的链接如下所示: http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf?expires=1488905432&signature=fd82b06725096b8e6c43221a9616e420

我还添加了使用包的中间件来保护链接的路由处理代码。 Route::get('protected-route', ['middleware' => 'signedurl', function () { return 'Hello secret world!'; }]);

但是生成的链接不可下载。我确实怀疑这是因为我将文件放在受保护的文件夹中。当我使用公用文件夹尝试此操作时,该文件可用。但是我的文件将没有任何保护。因为正如您在上面看到的,生成的链接包含我的文件夹的路径。

4

1 回答 1

1

由于您正在处理私有文件,因此通常最好不要让文件系统处理这些事情。相反,让 Laravel 去做,这样你就可以做所有你需要的检查,而你永远不必暴露实际的文件:

路线:

// set up a route group with your signedurl middleware
Route::group(['middleware' => 'signedurl'], function () {
    // create a new route which references a controller
    // the {path} is the location of the file
    // so your URLs would look something like
    // http://localhost:8888/media/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf
    Route::get('media/{path}', 'MediaController@getPrivateFile');
    // you can also do some validation using
    // ->where('path', '.*?');
});

然后在你的新控制器中:

class MediaController extends Controller
{
    public function getPrivateFile(Request $request, $pathToFile)
    {
        // check if file exists
        // if (file_exists) {
        //     # code...
        // }
        return response()->download($pathToFile);
    }
}

这样你的文件可以保持私有,你可以运行你的中间件,你可以在控制器中做任何你需要的额外检查。

于 2017-03-06T18:39:40.393 回答