我正在使用Laravel(ocotber CMS)开发我的项目,并使用Spatie URL Signer包来保护我的文件,使用有限的生命链接。我将文件上传到added_by
文件列入黑名单的受保护目录。
我的.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
但是生成的链接无法下载。 我怀疑这是因为我将文件放在受保护的文件夹中。当我使用公共文件夹尝试此文件时,该文件可用。但是我的文件没有保护。因为如上所示,生成的链接包含我的文件夹的路径。
答案 0 :(得分: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);
}
}
通过这种方式,您的文件可以保持私密,您可以运行中间件,并且可以在控制器中进行任何其他检查。