如果你重定向用戶使用瀏覽器302 Found
將根據其cache-control
頭緩存所產生的圖像標識的URL,並不會要求它的第二次。
爲了防止瀏覽器緩存中標識的URL本身,你應該與它一起發送正確Cache-Control
頭:
Cache-Control: private, no-cache, no-store, must-revalidate
因此,下一次它會發送請求到原始地址和將被重定向到一個新的簽署的網址。
您可以使用signedUrl
method生成帶knox
的簽名url。
但不要忘記爲每個上傳的圖像設置正確的標題。我建議您同時使用Cache-Control
和Expires
標頭,因爲某些瀏覽器不支持Cache-Control
標頭,並且Expires
只允許您設置絕對過期時間。
第二個選項(通過您的應用程序流式傳輸圖像)可以更好地控制情況。例如,您可以根據當前的日期和時間爲每個響應生成Expires
標題。
但速度怎麼樣?使用簽名的url有兩個好處,可能會影響頁面加載速度。
首先,你不會超載你的服務器。如果速度很快,則生成已簽名的網址,因爲您只是對您的AWS憑據進行哈希處理並且通過您的服務器流式傳輸圖像,您需要在頁面加載期間保持大量額外的連接。無論如何,除非你的服務器很難加載,否則它不會有任何實際的區別。
其次,瀏覽器在頁面加載期間每個主機名只保留兩個並行連接。因此,瀏覽器將在下載圖像時並行解析圖像。它還會阻止下載圖像,阻止下載任何其他資源。
無論如何,要絕對確定你應該運行一些基準測試。我的回答是基於我對HTTP規範的知識以及我在網絡開發方面的經驗,但我從來沒有試圖以我自己的方式提供圖像。直接從S3提供長緩存生存期的公共圖像可以提高頁面速度,如果您通過重定向完成,我相信情況不會改變。
您應該記住,通過您的服務器流式傳輸圖像將帶來Amazon CloudFront的所有優勢。但只要你直接從S3提供內容,這兩個選項都可以正常工作。
因此,有兩種情況使用已簽署的網址應該加速你的頁面時:
- 如果你有一個單一頁面上大量的圖片。
- 如果您使用CloudFront提供圖像。
如果你只有在每一頁上幾張圖片,並直接從S3爲他們提供服務,你可能不會看到任何差別。
重要更新
我進行了一些測試,發現我錯了有關緩存。瀏覽器確實緩存了他們被重定向到的圖片。但它將緩存的圖像與它重定向到的網址相關聯,而不是與原始網址相關聯。因此,當瀏覽器第二次加載頁面時,它會再次從服務器請求圖像,而不是從緩存中獲取圖像。當然,如果服務器使用相同的重定向url進行響應,它會首次響應,瀏覽器將使用它的緩存,但對於已簽名的url,情況並非如此。
我發現,迫使瀏覽器緩存標識的URL以及接收到的數據解決了這個問題。但我不喜歡緩存無效重定向網址的想法。我的意思是,如果瀏覽器以某種方式錯過了圖像,它會嘗試使用緩存中的無效簽名url再次請求它。所以,我認爲這不是一個選擇。
如果CloudFront的服務更快的圖像,或者如果瀏覽器限制每個主機並行下載的數量,使用瀏覽器緩存的優勢,通過你的服務器超出管道圖像的所有缺點都無所謂。
它看起來像大多數社交網絡通過隱藏其真實URL背後的一些私人代理解決了私人圖像的問題。因此,他們將所有內容存儲在公共服務器上,但沒有辦法在未經授權的情況下將url鏈接到私人圖像。當然,如果您將在新標籤中打開私密圖片並將網址發送給您的朋友,他也可以看到圖片。所以,如果它不適合你,那麼最好使用Jonathan Ong's solution。
我會以你的答案爲例。非常感謝。但是,如果你不介意你是否可以再幫助我一件事。使用AWS-SDK更好還是knox? –
從未嘗試過aws-sdk。然而,Knox維護者更多地參與節點社區。 –
但是??然而你沒有提到什麼? –