使用evaporate.js直传S3遇403错误,签名问题求助
解决Evaporate.js上传AWS S3时的403签名错误
我之前也踩过类似的坑,结合你给出的代码,咱们一步步排查和解决这个403签名问题:
1. 先排查AWS基础配置问题
- 首先确认你的AWS Access Key和Secret Key完全正确,没有拼写错误、多余空格。另外,对应的IAM用户必须拥有S3上传权限,至少要包含
s3:PutObject权限;同时检查Bucket的CORS配置,要允许你的域名发起POST、PUT请求,Origin设置要匹配你的网站域名。 - 如果Bucket不在默认的
us-east-1区域,一定要在Evaporate初始化时指定正确的region参数,否则签名会因为区域不匹配失败。
2. 修正签名脚本的潜在问题
你的Signature.php有几个容易忽略的细节需要调整:
<?php // 强制设置UTC时区,AWS签名验证对时间一致性要求极高 date_default_timezone_set('UTC'); // 清空输出缓冲区,避免PHP的警告、空格等多余内容污染签名结果 ob_clean(); $to_sign = $_GET['to_sign']; $secret = '你的AWS_SECRET_KEY'; // 增加参数校验,避免空值导致的错误 if (empty($to_sign) || empty($secret)) { http_response_code(400); echo "Invalid request parameters"; exit; } $hmac_sha1 = hash_hmac('sha1', $to_sign, $secret, true); $signature = base64_encode($hmac_sha1); echo $signature; exit; ?>
- 重点:确保服务器返回的只有签名字符串,没有任何额外输出(比如PHP的错误提示、HTML标签),这些都会导致AWS验证签名失败。
- 可以在浏览器开发者工具的Network面板里,查看向
Signature.php发送的请求,确认to_sign参数完整,且返回的签名没有多余字符。
3. 完善Evaporate.js的初始化配置
你给出的上传函数参数不全,补充必要配置后再测试:
function largeFileUPload(file) { var ins = new Evaporate({ signerUrl: './includes/s3-signature.php', aws_key: "你的AWS_ACCESS_KEY", bucket: "你的S3 Bucket名称", region: "your-bucket-region", // 比如 'us-west-2',必须和Bucket实际区域一致 ssl: true, // 如果你的网站是HTTPS协议,务必开启 logging: true, // 开启日志,方便调试过程中查看详细请求信息 computeContentMd5: true // 可选,有助于AWS验证文件完整性 }); ins.add({ name: file.name, file: file, progress: function(progress) { console.log("上传进度: " + Math.round(progress*100) + "%"); }, complete: function(xhr, awsKey) { console.log("上传完成! 文件路径: " + awsKey); }, error: function(msg) { console.error("上传错误: " + msg); } }); }
4. 额外调试技巧
- 打开浏览器开发者工具的Network标签,查看向S3发送的请求,403响应的Body里通常会有AWS给出的具体错误原因(比如
SignatureDoesNotMatch、AccessDenied),根据提示精准排查。 - 检查服务器时间:如果你的服务器时间和AWS服务器时间差超过5分钟,签名会直接验证失败,确保服务器时间同步准确。
内容的提问来源于stack exchange,提问作者Lonergan6275
相关产品推荐
相关产品推荐

