2015-04-15 194 views
7

我試圖設置S3靜態網站託管,但它似乎在任何沒有在AWS控制檯中設置的Content-Type元數據字段的對象上返回403。我無法弄清楚如何使用AWS CLI工具來做到這一點。如何在使用AWS CLI上傳到S3時設置Content-Type?

使用--metadata選項似乎工作:

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --metadata Content-Type=text/html 
{ 
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"" 
} 
$ aws s3api head-object --bucket <bucket> --key foo.html 
{ 
    "AcceptRanges": "bytes", 
    "ContentType": "binary/octet-stream", 
    "LastModified": "Wed, 15 Apr 2015 06:39:48 GMT", 
    "ContentLength": 189, 
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"", 
    "Metadata": { 
     "content-type": "text/html" 
    } 
} 

但是在對象上的Content-Type場是不可見的AWS控制檯的「元數據」部分中,我也得到一個403試圖訪問時該文件在瀏覽器中。

使用--content-type選項也不起作用:

$ aws s3api put-object --bucket <bucket> --key foo.html --body foo.html --content-type text/html 
{ 
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"" 
} 
$ aws s3api head-object --bucket <bucket> --key foo.html 
{ 
    "AcceptRanges": "bytes", 
    "ContentType": "text/html", 
    "LastModified": "Wed, 15 Apr 2015 06:46:49 GMT", 
    "ContentLength": 189, 
    "ETag": "\"fd5ff7743e5ed1e1c304eb1c34e8e39f\"", 
    "Metadata": {} 
} 

雖然它似乎設置某種特殊ContentType財產,仍然沒有在AWS控制檯Content-Type元數據字段,我也不能在瀏覽器中訪問該文件。

我也試過類似的命令(aws s3 cp,aws s3 sync),沒有運氣。我將存儲桶策略設置爲公共可讀。

回答

11

--content-type的第二個示例是設置對象的內容類型的方法。顯示的JSON響應將HTTP響應中的Content-Type標題映射到ContentType鍵,但它對應於該對象的實際標題Content-Type。我確認在使用--content-type時,內容類型值在控制檯的元數據部分中顯示。

$ aws s3api put-object --bucket bucket --key foo.json --body foo.json --content-type application/json --acl public-read 

$ aws s3api head-object --bucket jamesls-test-sync --key foo.json 
{ 
    "AcceptRanges": "bytes", 
    "ContentType": "application/json", 
    "LastModified": "Wed, 15 Apr 2015 17:18:58 GMT", 
    "ContentLength": 0, 
    "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", 
    "Metadata": {} 
} 

而且使用curl,我們可以看到的內容類型標頭設置:

$ curl -I https://bucket.s3.amazonaws.com/foo.json 
HTTP/1.1 200 OK 
x-amz-id-2: ZlSg1aDUBu7z+9gWUg24uRn2TioI0hk2AGBBZ1iVbpUkv8RTrHWovzbHxL/y21Qe 
x-amz-request-id: 8568C73EB95EE5A6 
Date: Wed, 15 Apr 2015 17:20:42 GMT 
Last-Modified: Wed, 15 Apr 2015 17:18:58 GMT 
ETag: "d41d8cd98f00b204e9800998ecf8427e" 
Accept-Ranges: bytes 
Content-Type: application/json 
Content-Length: 0 
Server: AmazonS3 
+0

如果我省略'--acl public-read'參數,這不起作用。有沒有辦法讓鎖定訪問某個IP範圍的工作,就像我在存儲桶策略中所做的那樣? –

+0

不要緊,看起來這個設置已經完全符合我的要求:即使對象ACL設置爲「public-read」,存儲桶策略仍然適用。 –

0

在AWS控制檯,你可以在你想即使內容類型的內容類型按鍵未在下拉列表中列出。