如何用PHP生成仅含3个参数的AWS S3签名URL?是否需要AWS SDK?
核心结论
- 你需要的简洁格式URL是S3 V2版本签名算法生成的结果,AWS PHP SDK 3默认使用安全性更高的V4版本签名算法,所以生成的URL参数会更多
- 生成该类型URL不必须使用AWS SDK,手动实现V2签名逻辑即可,但要注意:V2签名仅支持部分2014年之前上线的AWS区域,如果你使用的是2014年后新增的区域(如亚太(香港)、欧洲(巴黎)等),则无法使用V2签名,只能使用V4签名。
方法1:不依赖AWS SDK的纯PHP实现
<?php // 按需修改以下配置参数 $accessKey = '你的AWS_ACCESS_KEY_ID'; $secretKey = '你的AWS_SECRET_ACCESS_KEY'; $bucket = 'xyz'; // 存储桶名称 $filePath = 'pathoffile'; // 文件在存储桶内的路径 $expires = time() + 18000; // 签名有效期,这里设置为当前时间后5小时 // 构造待签名字符串 $stringToSign = "GET\n\n\n{$expires}\n/{$bucket}/{$filePath}"; // 计算HMAC-SHA1签名并做Base64编码 $signature = base64_encode(hash_hmac('sha1', $stringToSign, $secretKey, true)); // 对签名做URL编码 $signature = urlencode($signature); // 拼接最终签名URL $signedUrl = "https://{$bucket}.s3.amazonaws.com/{$filePath}?AWSAccessKeyId={$accessKey}&Expires={$expires}&Signature={$signature}"; echo $signedUrl; ?>
注意:
- 如果文件路径包含特殊字符,需要先对路径做URL编码处理
- V2签名已被AWS官方标记为废弃,生产环境优先推荐使用V4版本签名
方法2:基于AWS PHP SDK 3生成V2签名URL
如果你仍希望通过SDK实现,只需在初始化S3客户端时指定签名版本为V2即可:
<?php require 'vendor/autoload.php'; use Aws\S3\S3Client; $s3Client = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', // 存储桶所在区域,必须是支持V2签名的区域 'credentials' => [ 'key' => '你的AWS_ACCESS_KEY_ID', 'secret' => '你的AWS_SECRET_ACCESS_KEY', ], 'signature_version' => 'v2' // 关键配置,指定使用V2版本签名 ]); $cmd = $s3Client->getCommand('GetObject', [ 'Bucket' => 'xyz', 'Key' => 'pathoffile' ]); // 设置签名有效期为5小时 $request = $s3Client->createPresignedRequest($cmd, '+5 hours'); $signedUrl = (string) $request->getUri(); echo $signedUrl; ?>
内容的提问来源于stack exchange,提问作者Kashish Goyal
相关产品推荐
相关产品推荐

