Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS S3通过代理获取图像-PHP_Php_Amazon S3_Aws Sdk_Aws Php Sdk - Fatal编程技术网

AWS S3通过代理获取图像-PHP

AWS S3通过代理获取图像-PHP,php,amazon-s3,aws-sdk,aws-php-sdk,Php,Amazon S3,Aws Sdk,Aws Php Sdk,我在S3有一个存储桶,在那里我上传了图片。 现在我使用AWS-SDK获取图像。现在我想通过代理绕过图像 $client = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => 'us-east-1', 'debug' => TRUE, // enable debug info 'stats'

我在S3有一个存储桶,在那里我上传了图片。 现在我使用AWS-SDK获取图像。现在我想通过代理绕过图像

$client = new Aws\S3\S3Client([
            'version'     => 'latest',
            'region'      => 'us-east-1',
            'debug'       => TRUE, // enable debug info
            'stats'       => TRUE, // enable stats
            '@http'  => [
            'proxy' => 'http://192.168.16.1:10'
            ],
            'credentials' => [
                'key'    => base64_decode(KEY),
                'secret' => base64_decode(SECRET)
            ]
        ]);
这是我的bucket设置,当我这样做的时候,仍然在请求中显示AWS ip地址


谁能告诉我如何用代理绕过S3图像吗

如果我理解正确,您希望为您的图像设置一个保留代理,例如,您的系统下载发送到浏览器的图像,以便它可以渲染它们,并且您不希望用户知道您的路径/您不希望对您的存储桶进行公共读取访问

如果是这种情况,您可以使用以下代码通过

$result = $client->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));

header("Content-Type: {$result['ContentType']}");
echo $result['Body'];
然后可以在一个特定的URL上设置密钥作为参数,或者如果您的bucket得到了正确的保护,您可以通过GET使用密钥名,例如URL
image.php?key=some/key/on/aws.jpg
,并在文件中使用
$keyname=$\u GET['key']

如果您使用MySQL表来使用查找,那么它将是
$id=$\u GET['id']
并创建一个防止SQL注入的函数,并返回
列,然后将该列用于
$keyname
示例表
$keyname
,可以通过映射数据库表进行设置,例如

CREATE TABLE `proxy_map`(
   `id` INT(11) NOT NULL PRIMARY KEY,
   `key` TEXT NOT NULL
)
如果你想限制它,所以只有这个特定的网站可以使用它,你可以使用推荐人检查

$url = parse_url($_SERVER['HTTP_REFERER'] , PHP_URL_HOST);
if($url !== $_SERVER[HTTP_HOST]){ // assuming that the images are only loaded on the same site as this php script
    http_response_code(404);
    echo "<h1>File Not Found</h1><p>Sorry the file you were looking for could not be found</p>";
}

“我不想让CSS和图像公开访问。”那么浏览器如何使用它们呢?每个网站css\images\js都必须能够被用户的浏览器访问,网站才能正常工作。如果他们想通过S3URL直接访问,我不想允许他们访问该图像。私有图像如何?可以通过两种方式直接从S3访问“私有”内容;1)由具有属于bucket所有者的客户端机密凭据的服务器进程执行,或2)由浏览器直接执行,该浏览器使用客户端密钥凭据获取由您的服务器的用户以加密方式签名的访问请求。后者是使用javascript请求(通常是异步XMLHTTPRequest)执行的,首先是对服务器的签名请求,然后是对S3的内容请求。@HituBansal您可以,但不要混淆此配置以实际保护此内容。所有这些都使得热链接变得更加困难。任何人只要有一个小的技能水平,就可以轻松地绕过这一点,下载您的对象。。。这使得其他网站很难在未经您允许的情况下通过链接到您的内容来窃取您的带宽。这里的问题似乎是请求不符合您的期望。检查请求头、浏览器中的错误控制台和S3访问日志,并报告您发现的内容。@shukshin.ivan请走开,因为您显然不了解AWS API中S3类的工作原理。也不知道基本下载和保留代理是如何工作的……是的,但是上面代码中“proxy”=>“的用途是什么。@HituBansal用于服务器的出站连接,因此它通过外部internet代理,就像大多数公司网络一样。例如,我可以使用交换机路由器连接到互联网,或者我可以通过调制解调器将一台机器置于互联网连接上。然后,这台机器充当另一个网卡的DHCP服务器,因此它是自己的内部网络,这意味着DHCP网络上的东西不能访问internet,除非我在机器上启动一个代理,使用该服务器的internet连接服务于DHCP网络,这就是代理的工作方式。请阅读什么是代理服务器
$url = parse_url($_SERVER['HTTP_REFERER'] , PHP_URL_HOST);
$allowedDomains = array(
    $_SERVER[HTTP_HOST],
    "www.example.com"
);
if(!in_array($url, $allowdDomains))