2

我試圖實現的是將我的靜態資源CSS, JS, images, uploded images(約1百萬)同步到S3 bucket,並使用cloudfront發送它們。爲了進行同步,我正在使用AWS PHP SDK v2.8x。以下是我的代碼:gzipping,AWS S3,cloudfront和我的服務器同步問題

$folder = $_GET['folder']; 
    $concurrency = $_GET['concurrency']; 
    $force = $_GET['force']; 
    $rootPath = Yii::$app->params['root_path']; 
    $bucket = 'my-bucket'; 
    $client = S3Client::factory(array( 
     'key' => "my-key", 
     'secret' => "my-secret", 
     'stats' => true 
    )); 
    $params = array(); 
    $metadata = array(); 
    $options = array(); 
    $params['ACL'] = 'public-read'; 
    //$params['ContentEncoding'] = 'gzip'; 
    $params['Expires'] = 'Wed, 20 Jun 2018 07:48:05 GMT'; 
    $params['CacheControl'] = 'max-age=31536000'; 
    $options['params'] = $params; 
    $options['concurrency'] = $concurrency; 
    //$options['debug'] = true; 
    $options['force'] = $force; 
    $client->uploadDirectory($rootPath.'/'.$folder, $bucket, $folder, $options); 

我已成功將所有內容上傳到S3存儲桶並與雲端同步也正常工作。但問題是我無法gzip任何這種內容導致巨大的頁面大小。此外,過期標題也不反映在雲端。如果我啓用$params['ContentEncoding'] = 'gzip'; 我得到ERR_CONTENT_DECODING_FAILED。我也對CloudFront設置進行了更改,但似乎沒有任何效果。 另外,請幫助我同步S3,CloudFront和我的服務器的最佳做法。

我目前的php框架是YII2。

請告訴我,如果需要添加信息,我會進行編輯。

在此先感謝。

回答

2

$params['ContentEncoding'] = 'gzip';實際上並沒有gzip您的內容 - 它用於表示您已經在上傳之前自己對其進行了gzip壓縮。

如果你設置了,而你沒有gzip的內容,那麼ERR_CONTENT_DECODING_FAILED將是正確的。

如果您在CloudFront緩存行爲中將「自動將壓縮對象」設置爲「是」,則可以將內容保存在未壓縮的S3中,並讓CloudFront對其進行gzip壓縮。

設置正確後,對*執行CloudFront緩存失效,然後再次測試。

此外,不要設置Expires標題。你幾乎肯定不會那樣做。

檢查CloudFront的標題時,請注意Age。這是多久之前,CloudFront在幾秒鐘內從S3中獲取對象。

+0

它工作。非常感謝! – sphinx

+0

網站優化不是過期的頭文件嗎? – sphinx

+1

我不這麼認爲。 'Expires'在RFC-7234中基本上被棄用,以支持'Cache-Control'。 [*「如果響應包含一個'Cache-Control'字段和'max-age'指令,收件人[必須]忽略Expires 字段。」*](https://tools.ietf.org/html /rfc7234#section-5.3)另請參閱https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching。 –