Amazon の S3 エンコーディング システムを処理してリンクを保護できるように、S3 リンクをエンコードする次の関数を作成しました。問題は、ファイルがバケットにある場合にのみ機能することです。バケットにサブフォルダーを作成してそこにファイルを貼り付けると、機能しません。私は何を間違っていますか?
function encodeS3($sURL,$sAccessKey,$sSecretKey,$nExpireMinutes = 5) {
$sFile = basename($sURL);
$sBucket = basename(str_replace('/' . $sFile,'',$sURL));
$asQuery = array(
'AWSAccessKeyId' => $sAccessKey,
);
$nExpireSecs = absint( $nExpireMinutes ) * 60;
$nExpireSecs = time() + absint( $nExpireSecs );
$asQuery[ 'Expires' ] = $nExpireSecs;
$sAmazonText = "GET\n\n\n{$nExpireSecs}\n/{$sBucket}/{$sFile}";
$asQuery[ 'Signature' ] = urlencode( base64_encode( ( hash_hmac( 'sha1', utf8_encode( $sAmazonText ), $sSecretKey, TRUE ) ) ) );
$s = add_query_arg( $asQuery, "https://s3.amazonaws.com/{$sBucket}/{$sFile}" );
return esc_url($s);
}