儲存貯體的虛擬託管 - Amazon Simple Storage Service

儲存貯體的虛擬託管

虛擬託管是從單一 Web 伺服器服務多個網站的實務。其中一種區分 Amazon S3 REST API 要求網站的方式是使用要求 URI 的清楚主機名稱,而不只是 URI 的路徑名稱部分。一般 Amazon S3 REST 請求會使用 Request-URI 路徑的第一個斜線區隔元件,來指定儲存貯體。反之,您可以使用 HTTP Host 標頭,以使用 Amazon S3 虛擬託管來處理 REST API 呼叫中的儲存貯體。實務上,Amazon S3 會將 Host 解譯為表示可在 https://bucket-name.s3.region-code.amazonaws.com 自動存取大部分的儲存貯體 (針對有限類型的請求)。如需 Amazon S3 區域和端點的完整清單,請參閱《Amazon Web Services 一般參考》中的 Amazon S3 端點和配額

虛擬託管也有其他優勢。在註冊的網域名稱後面命名儲存貯體,以及將該名稱設為 Amazon S3 的 DNS 別名,即可完全自訂 Amazon S3 資源的 URL (例如,http://my.bucket-name.com/)。您也可以發佈到儲存貯體虛擬伺服器的「根目錄」。這項能力十分重要,因為許多現有應用程式都會在此標準位置中搜尋檔案。例如,預期都可以在根目錄中找到 favicon.icorobots.txtcrossdomain.xml

重要

當您搭配使用虛擬託管型儲存貯體與 SSL 時,SSL 萬用字元憑證只會符合不包含點 (.) 的儲存貯體。若要解決此限制,請使用 HTTP 或撰寫您自己的憑證驗證邏輯。如需詳細資訊,請參閱AWS 新聞部落格上的 Amazon S3 路徑取代計劃

路徑樣式請求

Amazon S3 目前支援所有 AWS 區域 中的虛擬託管樣式 URL 與路徑樣式 URL 存取。但是,將來會停產路徑樣式 URL。如需詳細資訊,請參閱下列 Important (重要) 注意事項。

在 Amazon S3 中,路徑樣式 URL 使用以下格式:

https://s3.region-code.amazonaws.com/bucket-name/key-name

例如,如果您在美國西部 (奧勒岡) 區域中建立名為 amzn-s3-demo-bucket1 的儲存貯體,且需要存取該儲存貯體中的 puppy.jpg 物件,則可使用以下路徑型 URL:

https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket1/puppy.jpg
重要

更新 (2020 年 9 月 23 日) – 我們決定將棄用路徑樣式 URL 的日期延後,以確保客戶有足夠時間轉換為虛擬託管樣式 URL。如需詳細資訊,請參閱 AWS 新聞部落格中Amazon S3 路徑廢除計畫 - 其他故事

警告

託管將從 Web 瀏覽器存取的網站內容時,請避免使用路徑樣式 URL,這可能會干擾瀏覽器相同來源的安全模型。若要託管網站內容,建議您使用 S3 網站端點或 CloudFront 分發。如需詳細資訊,請參閱《AWS 規定指引模式》中的網站端點將 React 型單一頁面應用程式部署到 Amazon S3 和 CloudFront

虛擬託管樣式請求

在虛擬託管式的 URL 中,儲存貯體名稱是 URL 中網域名稱的一部分。

Amazon S3 虛擬託管樣式 URL 使用以下格式:

https://bucket-name.s3.region-code.amazonaws.com/key-name

在此範例中,amzn-s3-demo-bucket1 是儲存貯體名稱、美國西部 (奧勒岡)是區域,而 puppy.png 是金鑰名稱。

https://amzn-s3-demo-bucket1.s3.us-west-2.amazonaws.com/puppy.png

HTTP Host 標頭儲存貯體規格

只要 GET 要求未使用 SSL 端點,就可以使用 HTTP Host 標頭來指定要求的儲存貯體。REST 要求中的 Host 標頭解譯如下:

  • 如果省略 Host 標頭,或其數值為 s3.region-code.amazonaws.com,則請求的儲存貯體會是 Request-URI 的第一個斜線區隔元件,而請求金鑰會是 Request-URI 的其他部分。這是一般方法,如本節的第一個與第二個範例所述。省略 Host 標頭僅對 HTTP 1.0 要求有效。

  • 否則,如果 Host 標頭值的結尾為 .s3.region-code.amazonaws.com,則儲存貯體名稱是 Host 標頭值到 .s3.region-code.amazonaws.com 的前置元件。要求的金鑰是 Request-URI。這項解譯會將儲存貯體公開為 .s3.region-code.amazonaws.com 的子網域,如本節的第三個與第四個範例所述。

  • 否則,要求的儲存貯體是 Host 標頭的小寫值,而且要求的金鑰是 Request-URI。如果您已註冊與儲存貯體名稱相同的 DNS 名稱,並且已將該名稱設為 Amazon S3 的正式名稱 (CNAME) 別名,則這項解譯十分有用。註冊網域名稱與設定 CNAME DNS 記錄的程序不是本指南的討論範圍,但本節的最後一個範例會說明其結果。

範例

本節提供 URL 範例與要求。

範例 — 路徑樣式 URL 和請求

此範例使用下列各項:

  • 儲存貯體名稱 ‐ example.com

  • 區域 - 美國東部 (維吉尼亞北部)

  • 金鑰名稱‐ homepage.html

URL 如下:

http://s3.us-east-1.amazonaws.com/example.com/homepage.html

要求如下:

GET /example.com/homepage.html HTTP/1.1 Host: s3.us-east-1.amazonaws.com

使用 HTTP 1.0 且省略 Host 標頭的要求如下:

GET /example.com/homepage.html HTTP/1.0

如需 DNS 相容名稱的資訊,請參閱限制。如需金鑰的詳細資訊,請參閱

範例 — 虛擬託管樣式 URL 和請求

此範例使用下列各項:

  • 儲存貯體名稱amzn-s3-demo-bucket1

  • 區域- 歐洲 (愛爾蘭)

  • 金鑰名稱homepage.html

URL 如下:

http://amzn-s3-demo-bucket1.s3.eu-west-1.amazonaws.com/homepage.html

要求如下:

GET /homepage.html HTTP/1.1 Host: amzn-s3-demo-bucket1.s3.eu-west-1.amazonaws.com
範例 — CNAME 別名方法

若要使用此方法,您必須將 DNS 名稱設為 bucket-name.s3.us-east-1.amazonaws.com 的 CNAME 別名。如需詳細資訊,請參閱「使用 CNAME 記錄自訂 Amazon S3 URL」。

此範例使用下列各項:

  • 儲存貯體名稱 ‐ example.com

  • 金鑰名稱homepage.html

URL 如下:

http://www.example.com/homepage.html

範例如下:

GET /homepage.html HTTP/1.1 Host: www.example.com

使用 CNAME 記錄自訂 Amazon S3 URL

根據需求,您可能不想要 s3.region-code.amazonaws.com 出現在網站或服務上。例如,如果您在 Amazon S3 上託管網站映像,則可能會想要使用 http://images.example.com/,而不是 http://images.example.com.s3.us-east-1.amazonaws.com/。任何具有 DNS 相容名稱的儲存貯體都可以參考如下: http://BucketName.s3.Region.amazonaws.com/[Filename] (例如,http://images.example.com.s3.us-east-1.amazonaws.com/mydog.jpg)。使用 CNAME,即可將 images.example.com 對應到 Amazon S3 主機名稱,讓前一個 URL 可以成為 http://images.example.com/mydog.jpg

您的儲存貯體名稱必須與 CNAME 相同。例如,如果您要建立 CNAME,以將 images.example.com 對應至 images.example.com.s3.us-east-1.amazonaws.com,則 http://images.example.com/filenamehttp://images.example.com.s3.us-east-1.amazonaws.com/filename 將是相同的。

CNAME DNS 記錄應該會將網域名稱別名設為適當的虛擬託管式主機名稱。例如,如果您的儲存貯體名稱與網域名稱是 images.example.com,且您的儲存貯體在美國東部 (維吉尼亞北部) 區域中,CNAME 記錄應該會將別名設為 images.example.com.s3.us-east-1.amazonaws.com

images.example.com CNAME images.example.com.s3.us-east-1.amazonaws.com.

Amazon S3 會使用主機名稱來判斷儲存貯體名稱。因此,儲存貯體名稱必須與 CNAME 相同。例如,假設您已將 www.example.com 設定為 www.example.com.s3.us-east-1.amazonaws.com 的 CNAME。當您存取 http://www.example.com 時,Amazon S3 會收到與下列類似的請求:

GET / HTTP/1.1 Host: www.example.com Date: date Authorization: signatureValue

Amazon S3 只會查看原始主機名稱 www.example.com,並不了解用來解析請求的 CNAME 映射。

您可以在 CNAME 別名中使用任何 Amazon S3 端點。例如,s3.ap-southeast-1.amazonaws.com 可以用於 CNAME 別名中。如需端點的詳細資訊,請參閱 Amazon S3 API 參考中的請求端點。若要使用自訂網域建立靜態網站,請參閱 教學課程:使用向 Route 53 註冊的自訂網域設定靜態網站

重要

搭配 CNAME 使用自訂 URL 時,您必須確定您設定的任何 CNAME 或別名記錄都有相符的儲存貯體。例如,如果您建立的 DNS 項目 www.example.comlogin.example.com 要使用 S3 發布 Web 內容,您需要建立兩個儲存貯體 www.example.comlogin.example.com

當設定 CNAME 或別名記錄指向沒有相符儲存貯體的 S3 端點時,任何 AWS 使用者即使擁有權不同,都可以建立該儲存貯體,並在設定的別名下發布內容。

基於相同原因,我們建議您在刪除儲存貯體時變更或移除對應的 CNAME 或別名。

如何建立主機名稱與 Amazon S3 儲存貯體的關聯

使用 CNAME 別名建立主機名稱與 Amazon S3 儲存貯體的關聯
  1. 選取屬於所控制網域的主機名稱。

    此範例使用 images 網域的 example.com 子網域。

  2. 建立與主機名稱相符的儲存貯體。

    在此範例中,主機與儲存貯體名稱為 images.example.com。儲存貯體名稱必須完全符合主機名稱。

  3. 建立 CNAME DNS 記錄,將主機名稱定義為 Amazon S3 儲存貯體的別名。

    例如:

    images.example.com CNAME images.example.com.s3.us-west-2.amazonaws.com

    重要

    基於要求路由原因,必須如先前範例所示定義完全相同的 CNAME DNS 記錄。否則,它可能看來操作正常,但最後會導致無法預期的行為。

    設定 CNAME DNS 記錄的程序取決於 DNS 伺服器或 DNS 供應商。如需特定資訊,請參閱伺服器文件或聯絡提供者。

限制

HTTP 上的 SOAP 支援已淘汰,但仍可透過 HTTPS 取得 SOAP。SOAP 不支援新的 Amazon S3 功能。建議您不使用 SOAP,而改用 REST API 或 AWS SDK。

回溯相容性

以下各區段涵蓋 Amazon S3 回溯相容性的各個面向,這些面向與路徑樣式和虛擬託管樣式 URL 請求相關。

舊版端點

某些區域支援舊版端點。您可能會在伺服器存取日誌或 AWS CloudTrail 日誌中看到這些端點。如需詳細資訊,請檢閱下列資訊。如需 Amazon S3 區域和端點的完整清單,請參閱《Amazon Web Services 一般參考》中的 Amazon S3 端點和配額

重要

雖然您可能會在記錄檔中看到舊版端點,但建議您永遠使用標準端點語法來存取儲存貯體。

Amazon S3 虛擬託管樣式 URL 使用以下格式:

https://bucket-name.s3.region-code.amazonaws.com/key-name

在 Amazon S3 中,路徑樣式 URL 使用以下格式:

https://s3.region-code.amazonaws.com/bucket-name/key-name

s3‐Region

某些較舊的 Amazon S3 區域支援在 s3 和區域代碼 (例如 s3‐us-west-2) 之間包含破折號 (-),而不是點 (例如 s3.us-west-2) 的端點。如果您的儲存貯體位於這些區域之一,您可能會在伺服器存取日誌或 CloudTrail 日誌中看到下列端點格式:

https://bucket-name.s3-region-code.amazonaws.com

在此範例中,儲存貯體名稱為 amzn-s3-demo-bucket1,區域為美國西部 (奧勒岡):

https://amzn-s3-demo-bucket1.s3-us-west-2.amazonaws.com

舊版全域端點

對於某些區域,您可以使用舊版全域端點來建構未指定區域特定端點的請求。舊版全域端點如下所示:

bucket-name.s3.amazonaws.com

在伺服器存取日誌或 CloudTrail 日誌中,您可能會看到使用舊版全域端點的請求。在此範例中,儲存貯體名稱為 amzn-s3-demo-bucket1,且顯示舊版全域端點:

https://amzn-s3-demo-bucket1.s3.amazonaws.com
美國東部 (維吉尼亞北部) 虛擬託管樣式請求

依預設,使用舊版全域端點提出的請求會前往美國東部 (維吉尼亞北部) 區域。因此,有時候會使用舊版全域端點來取代美國東部 (維吉尼亞北部) 的區域端點。如果您在美國東部 (維吉尼亞北部) 建立儲存貯體並使用全球端點,則依預設,Amazon S3 會將您的請求路由至此區域。

其他區域的虛擬託管樣式請求

舊版全域端點也可用於其他支援區域中的虛擬託管樣式請求。當您在 2019 年 3 月 20 日之前推出的區域建立儲存貯體並使用舊版全域端點時,Amazon S3 會更新 DNS 記錄,將請求重新路由至正確位置,這可能需要一些時間。在此期間系統會套用預設規則,而您的虛擬託管樣式請求會傳送至美國東部 (維吉尼亞北部) 區域。然後 Amazon S3 會使用 HTTP 307 暫時重新導向到正確的區域以將其重新導向。

若 S3 儲存貯體所在區域是在 2019 年 3 月 20 日之後推出,則 DNS 伺服器不會將您的請求路由至您儲存貯體所在的 AWS 區域。而是會傳回 HTTP 400 錯誤的請求錯誤。如需詳細資訊,請參閱 Amazon S3 API 參考中的提出請求

路徑樣式請求

對於美國東部 (維吉尼亞北部) 區域,您可以將舊版全域端點使用於路徑樣式請求。

對於所有其他區域,在嘗試存取儲存貯體時,路徑型語法會需要您使用區域專用端點。如果您嘗試存取的儲存貯體具有舊版全域端點或與儲存貯體所在區域不同的另一個端點,則會收到 HTTP 回應碼 307 暫時重新導向錯誤和指出資源正確 URI 的訊息。例如,如果您對在美國西部 (奧勒岡) 區域中建立的儲存貯體使用 https://s3.amazonaws.com/bucket-name,您會收到 HTTP 307 暫時重新導向錯誤。