You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;
?>

注意:

  1. 如果文件路径包含特殊字符,需要先对路径做URL编码处理
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:33:00