2016-02-05 115 views
2

我已經爲默認行爲(無緩存)設置了cloudfront,elb和我的ec2 web服務器,一切工作正常。只有1個原點(elb),原點路徑是空的。 現在我想從web服務器(wildfly)像js/css那樣緩存靜態的東西,它們都在/ my-context/assets文件夾中提供cloudfront無法請求對象的行爲

因此,我添加了一個新的行爲與路徑模式'/ my-context/assets/*'和使用相同原點的默認緩存設置。 這不工作,我的請求登錄頁面返回頁面html本身,但所有的CSS/JS失敗。請求/my-context/assets/a/b/some.css返回502,「CloudFront無法連接到原始地址」。

我也嘗試爲新行爲設置一個新路徑「/ my-context/assets」的起源(使用相同的elb),但它也失敗。

我能說明如何使這項工作?或者這實際上是不可行的?

謝謝!

+0

你絕對不需要第二個來源,並將原始路徑設置爲任何* prepends *由瀏覽器發送到請求路徑的原始路徑,因此您也不需要它。在第一種情況下(2種行爲,1種起源),您是否已將「Host:」標題列入了您希望啓用緩存的新行爲的白名單? –

+0

它的工作!謝謝! – klc

+0

我會將其作爲回答發佈,如果您確認 - 您需要在新行爲中將「Host:」標題列入白名單,對吧? –

回答

1

解決方法是配置緩存行爲以將Host:標頭轉發(白名單)到傳入請求的原點。

這並不意味着它在任何情況下都是「正確的」配置,但是很多時候它是可取的,甚至是需要的。

當CloudFront與您的原始服務器建立後端https連接時,服務器提供的證書不僅必須有效(未過期,未自簽名,由受信任的CA頒發,並且具有完整的中間鏈),但也必須有效的要求CloudFront將發送

對於CloudFront的與您的起源通信時使用HTTPS,證書中的域名必須符合下列值中的一個或兩個:

•您爲原產地域名指定的值您分配中的適用來源。

•如果您將CloudFront配置爲將主機標頭轉發到您的原始主機標頭的值。

來源上的SSL/TLS證書在「公用名稱」字段中包含域名,可能還有其他幾個字段在「主題備用名稱」字段中。 (CloudFront在證書域名中支持通配符)。如果您的證書不包含任何與Host域名或Host頭域域名匹配的域名,CloudFront會向查看器返回HTTP狀態碼502(錯誤網關) 。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html#SecureConnectionsHowToRequireCustomProcedure

在你的情況,你本來是貫穿CloudFront的請求與緩存禁用,這通常是通過配置CloudFront的所有請求頭轉發到原點,因爲這將自動禁用響應緩存來完成。

稍後,當您試圖配置第二個緩存行爲,以便可以緩存與某些路徑模式匹配的對象時,您自然不會將所有標題轉發到源 - 但在這種情況下,將轉發Host:標題(CloudFront指向爲「轉發標題」白名單)是必要的,因爲CloudFront似乎需要這些信息才能驗證源服務器正在呈現的證書。

如果您未轉發Host:標頭,則證書必須與上述原始域名一致,而就您的情況而言,我們顯然不是這種情況。如果Host:標頭未被列入轉發白名單,則CloudFront仍會在後端請求中發送主機標頭,但該標頭設置爲與源域名相同的值,因此證書必須與該值匹配。

如果不需要匹配一種或另一種方式(以及CloudFront對與源的HTTPS連接施加的所有其他條件),則這會阻止CloudFront確定後端連接正在由並且原始服務器真的是它聲稱的服務器,這是TLS/SSL提供的兩種保護之一(當然,其他保護是實際的流量加密)。