2013-08-24 72 views
0

其工作是我的內容的網址是AWS S3 URL CNAME 403期

https://<bucket>.s3.amazonaws.com/<object> http://<bucket>.s3.amazonaws.com/<object>
<bucket>.s3.amazonaws.com/<object>
s3.amazonaws.com/<bucket>/<object>

我想這個URL工作

<bucket>/<object>

但它不工作。

此代碼的工作

$request = $client->get("http://{$bucket}.s3.amazonaws.com/{$s3name}");
return $client->createPresignedUrl($request, $time);

此代碼不

$request = $client->get("http://{$bucket}/{$s3name}");
return $client->createPresignedUrl($request, $time);

有人可以幫我在這裏嗎?我必須使用https來完成這項工作嗎?我也添加了CNAME。

回答

0

要做到這一點,你需要使用虛擬主機:http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

這包括兩個部分 - 第一,建立一個CNAME以所需的主機名。接下來,請確保您在發出請求時發送正確的主機名。從文檔:

GET /homepage.html HTTP/1.1 
Host: johnsmith.net.s3.amazonaws.com 
+0

我做了這個CNAME的東西。 CNAME是文件。 .com指向 .s3.amazonaws.com。 – Toosick

+0

CNAME只是一個部分。您在提出請求時是否也發送了正確的主機標頭? –

+0

是的。我可以在/查看公開內容,但我無法查看來自AWS SDK PHP 2 API的私人簽名網址,這些網址爲/。我可以查看 .s3.amazonaws.com/的私人文件。 – Toosick

0

當簽約你會在主機名「s3.amazon ......」組件訪問桶的請求,將字符串到標牌包括資源,它看起來像這樣的:

/bucket/object 

自然的結論是,如果您使用的是虛擬主機鬥,那麼資源將是這樣的:

/object 

然而,這是不正確的。即使它沒有包含在url的路徑部分中(因爲s3從Host:標題中選取它),您仍然需要在要簽名的字符串中的對象名稱之前創建存儲桶名稱。

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html

爲了驗證這一點,你可以手動採取由你下顯示的代碼生成標識的URL「此代碼的工作,」更改主機名到你斗的名字,從路徑中刪除鬥,和你即使您已手動將URL重寫爲所需格式,也應該發現簽名仍然有效。

+0

是的,我已經嘗試過。它看起來像是重定向,但我沒有訪問該文件的權限。該網頁上寫着'403禁止 代碼:存取遭拒 消息:拒絕訪問 的requestId:6BABFAE0FAE788D7 主機ID:8PKrtuqW2DU + T3YXhcyBkkvj0RM3w04ojZTCe9NvxRXPu522Bi1FWTC7eR3mNgm0' – Toosick

+0

這是可能的,但如果你能夠訪問它的一種方式,你應該能夠訪問其它如果簽名憑證是相同的......您的存儲桶名稱全部爲小寫,除破折號或數字以外不能包含特殊字符,總共63個字符或更少,並且在DNS中,「your.bucket.com」配置爲CNAME指向到「your.bucket.com.s3.amazonaws.com」? –

+0

是的。我可以在/查看公開內容,但我無法查看來自AWS SDK PHP 2 API的私人簽名網址,這些網址爲/ Toosick