2016-01-14 61 views
1

通常可以通過檢查Accept-Encoding請求頭來檢測是否請求了壓縮。 Google App Engine會剝離此標頭。有沒有其他的方法來檢測這種事情?我想知道GAE是否會在發送之前壓縮特定響應。在GAE中檢測壓縮?

回答

0

我目前的解決方案是使用另一個se檢測壓縮。

我已經將我的頁面分成初始化存根和內容。存根包含一點,導致瀏覽器僅向第三方服務器請求壓縮檢測。如果通過,它會加載並注入內容。

這並不是最優的,但它確實有效,並且在不會對用戶產生重大影響的情況下減少了不負責任的殭屍程序的流量。

編輯:它發生在我身上,可能從客戶端推斷出這一點。使用AJAX並檢查的響應標頭Content-Encoding意味着GAE認爲客戶端需要壓縮,這意味着客戶端要求壓縮。

// Certain files aren't compressed by GAE even if requested so 'canary' 
// needs to be of a type and size to trigger compression 
$.get('canary').done(function(data, textStatus, jqXHR){ 
    // request succeeded 
    var contentEncoding = jqXHR.getResponseHeader('Content-Encoding'); 
    if(contentEncoding != null) { 
    if(!['gzip','deflate','sdch','br'].every(function(v,i,a){ 
     return contentEncoding.indexOf(v) < 0; 
    })) { 
     // accepted compression found, initiate remainder of page load 
     return; 
    } 
    } 
    // no acceptable compression, kill page 
}).fail(function(jqXHR, textStatus, errorThrown) { 
    // request failed, kill page 
}); 
2

GAE does this automatically,你不必擔心它在你的應用程序:

谷歌應用程序引擎會盡力滿足gzip壓縮的內容,以支持它的瀏覽器 。利用此方案是自動的,並且不需要對應用程序進行修改。

我們使用請求頭(Accept-Encoding,User-Agent) 和響應頭(Content-Type)的組合來確定最終用戶是否可以利用gzip內容。這種方法避免了 在流行瀏覽器中使用gzip內容的一些衆所周知的錯誤。要向 強制gzip內容提供服務,客戶端可能會提供'gzip'作爲Accept-Encoding和User-Agent請求標頭的值 。 如果不存在Accept-Encoding標頭,內容將永遠不會被壓縮。

和頭可在從應用程序GAE的實際的MSG到/來檢查(在生產中只,開發服務器進行壓縮)。我看到(在Firefox):

在請求:

的Accept-Encoding: 「gzip的,放氣」

在響應:

內容Enconding: 「gzip」

+0

我意識到這一點。我注意到,似乎編碼不佳或老化的機器人似乎是不請求壓縮內容的主要請求者。他們甚至僞造用戶代理。我寧願否認這些客戶端訪問,而不是提供配額內容。至於Accept-Encoding標頭,它並沒有達到應用程序本身的程度。我想象一下,谷歌處理壓縮的一部分。 – Ouroborus

+0

那麼,文檔是清楚的 - '用戶代理'被GAE剝離... –

+0

這很好。但問題是:應用程序是否有其他方式檢測到請求了壓縮(或檢測到GAE將應用壓縮)? – Ouroborus