我在 Cloudfront 上的签名 URL 在 PHP 中运行良好。存储桶策略适用于 S3 上的 HTTP 引荐来源网址,但由于 Cloudfront 不支持 HTTP 引荐来源网址检查,我只需要将文件提供给一个 IP 地址(理想情况下,请求文件并生成签名 URL 或我的 Web 服务器的客户端)。
有人可以帮我将 IP 地址元素添加到 JSON 代码中使其工作吗?
"IpAddress":{"AWS:SourceIp":"192.0.2.0/24"},
我迷失了 PHP 和政策声明,但我认为对于了解以下内容的人来说可能很容易:http://tinyurl.com/9czr5lp
下面是一个 AWS 示例,除了 IP 地址锁定外都有效。
如果有人可以帮我两分钟,我可以很快测试这个!
非常感谢您的帮助:)
乔恩
function getSignedURL($resource, $timeout)
{
$keyPairId = "XXXXXXXXXXXX";
$expires = time() + $timeout;
$json = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan": {"AWS:EpochTime":'.$expires.'}}}]}';
$fp=fopen("pk-XXXXXXXX.pem","r");
$priv_key=fread($fp,8192);
fclose($fp);
$key = openssl_get_privatekey($priv_key);
if(!$key)
{
echo "<p>Failed to load private key!</p>";
return;
}
//Sign the policy with the private key
if(!openssl_sign($json, $signed_policy, $key, OPENSSL_ALGO_SHA1))
{
echo '<p>Failed to sign policy: '.openssl_error_string().'</p>';
return;
}
//Create url safe signed policy
$base64_signed_policy = base64_encode($signed_policy);
$signature = str_replace(array('+','=','/'), array('-','_','~'), $base64_signed_policy);
//Construct the URL
$url = $resource.'?Expires='.$expires.'&Signature='.$signature.'&Key-Pair-Id='.$keyPairId;
return $url;
}
$url = getSignedURL("http://s675765.cloudfront.net/filename.mp4", 600);
print $url;
最佳答案
{"Statement":[{"Resource":"testRes","Condition":{"DateLessThan":{"AWS:EpochTime":1357034400},"IpAddress":{"AWS:SourceIp":"192.0.2.0\/24"}}}]}
这是一个有效的 JSON 字符串,包含填充值和转义值。
如果您将 IP 地址作为变量传递,请确保转义 /
例如
$escapedIp = str_replace( '/', '\/', $ipAddress );
看看 php json 扩展 这会让事情变得更容易:
示例语句作为 php 数组
$statement = array(
'Statement' => array(
array(
'Resource' => $resource,
'Condition' => array(
'DateLessThan' => array(
'AWS:EpochTime' => $expires
),
'IpAddress' => array(
'AWS:SourceIp' => $ipAddress
)
)
)
)
);
$json = json_encode( $statement );
关于php - 云端签名 url ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122105/