2016-10-12 38 views
0

比方說,我有兩個文件:一個用於Safari和一個用於Firefox。如何在AWS S3或cloudfront中添加基本邏輯?

我想檢查用戶代理並返回基於用戶代理的文件。

如何在不添加外部服務器的情況下執行此操作?

+0

什麼樣的文件? –

+0

例如兩個CSS文件。或者兩張圖片 – moeseth

回答

0

如果不添加額外的服務器,則無法執行此操作。

S3支持靜態內容。它不會¹根據請求標題改變其響應。

如果內容需要根據請求標題而變化,則CloudFront將依賴原始服務器。請注意,默認情況下,CloudFront不會將大多數標頭轉發到源,但可以在緩存行爲配置中更改此標頭。如果您將User-Agent標頭轉發到源,則緩存命中率會急劇下降,因爲CloudFront別無選擇,只能假定用戶代理字符串中的任何更改都可能觸發響應中的更改,因此緩存中的對象由特定的用戶代理字符串請求的請求將僅供未來具有相同用戶代理字符串的瀏覽器使用。它會緩存每個不同的副本,但這仍然會傷害你的命中率。如果您只想知道瀏覽器的一般類型,CloudFront可以在不實際轉發用戶代理字符串並導致相同的負面影響的情況下,注入特殊標題來告知原始用戶是桌面,智能電視,移動設備還是平板電腦在緩存命中率上。

因此,CloudFront 將爲每個唯一用戶代理正確緩存頁面的適當版本...但源服務器必須實現實際的內容選擇邏輯。當起源爲S3時,則不支持 - 除非在CloudFront和S3之間有服務器。這是一個完全有效的配置 - 我有這樣的設置,使用服務器在將請求發送到S3之前重寫從CloudFront接收到的請求路徑,然後將內容從S3返回到CloudFront,該內容將內容返回給瀏覽器。

AWS Lambda將成爲像這樣的應用程序的潛在候選人,充當CloudFront和S3之間必需的服務器(如果您願意的話,無服務器服務器)......但它尚未支持二進制數據,因此對於任何除了文字以外,這也不是一種選擇。


¹至少,這裏沒有任何相關性。 CORS存在例外情況,並且基於請求標頭的有限子集授予或拒絕訪問。

+0

那麼,有什麼更好的?在ec2上重寫路徑或從S3中獲取數據並從ec2發送到cloudfront?如果是這樣,雲端將如何緩存數據?既然相同的URL,基於User-Agent的響應會有所不同? – moeseth

+0

如果您配置CloudFront將'User-Agent'頭部轉發到原始地址,它會自動緩存每個不同版本的頁面,並將其用於具有完全相同用戶代理字符串的任何未來請求者。 「哪個更好?」這些只是表達同一事物的兩種方式。當我說「重寫路徑」時,我並不意味着重定向瀏覽器。我的意思是改變瀏覽器請求的路徑,以便在與瀏覽器請求的內容不同的情況下,從S3獲取想要提供的實際對象。將'/ index.html'更改爲'/ index.firefox.html'。 –