我用 PHP 创建了一个简单的文件浏览器,它通过生成过期查询 URL 链接到文件。因此,对于目录的每次访问,都会生成一个指向每个文件的链接,该链接的有效期为 900 秒。
我现在遇到的问题是生成的签名有时似乎会失败。这很奇怪,因为我有意使用外部 S3 库来生成 URL 和签名。
事实上,我尝试了以下库来生成签名:
库内部使用 hash_hmac('sha256', ... 或 hash_hmac('sha1', ... - 我也不明白为什么要使用不同的哈希算法。
由于所有库都有相同的问题,所以它也可能出现在我的 URL 生成代码中,尽管这很简单:
$bucket = "myBucket";
$filename = $object->Key;
$linksValidForSeconds = 900;
$url = $s3->get_object_url($bucket, $filename, $linksValidForSeconds);
Sp $bucket 和 $linksValidForSeconds 是常量,$filename 例如“媒体/图片/我的图片.png”。但是对于相同变量的事件,它有时有效,有时却无效。
有什么想法吗?
编辑:拼写错误/错误的常量变量名称已修复(感谢)
最佳答案
我发现了问题,它与我提到的代码无关。生成的 URL 被 urlencode() 发送到另一个 PHP 脚本。在那里我使用 URL 来显示来自 S3 的图像。我在那里使用了 urldecode() 来撤消更改,但显然这不是必需的。
所以每次签名包含某些字符时,urldecode() 都会更改它们并破坏它。
很抱歉省略了实际的问题代码。
关于PHP/亚马逊 S3 : Query string authentication sometimes fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754543/