gpt4 book ai didi

php - 通过使用 Spatie URL-Signer 生成有限生命周期的链接来保护文件

转载 作者:搜寻专家 更新时间:2023-10-31 21:22:53 24 4
gpt4 key购买 nike

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

我的 .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 () {
返回'你好 secret 世界!';
}]);

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

最佳答案

由于您正在处理私有(private)文件,因此通常最好不要让文件系统处理这些事情。相反,让 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', '.*?');
});

然后在你的新 Controller 中:

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

这样您的文件可以保持私密,您可以运行您的中间件,并且您可以在 Controller 中进行任何您需要的额外检查。

关于php - 通过使用 Spatie URL-Signer 生成有限生命周期的链接来保护文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com