【问题标题】:Detect compression in GAE?在 GAE 中检测压缩?
【发布时间】:2016-01-14 02:16:52
【问题描述】:

通常会通过检查 Accept-Encoding 请求标头来检测是否请求了压缩。 Google App Engine 会去除此标头。有没有其他方法可以检测到这种事情?我想知道 GAE 是否会在发送特定响应之前对其进行压缩。

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    GAE does this automatically,您的应用中无需担心:

    Google App Engine 尽最大努力将 gzip 压缩的内容提供给浏览器 支持它。利用这个方案是自动的,并且 无需修改应用程序。

    我们使用请求头的组合(Accept-Encoding、User-Agent) 和响应头(Content-Type)来确定是否 最终用户可以利用 gzip 压缩的内容。这种方法避免 流行浏览器中压缩内容的一些众所周知的错误。到 强制提供 gzip 压缩的内容,客户端可以提供“gzip”作为 Accept-Encoding 和 User-Agent 请求标头的值。 如果没有 Accept-Encoding 标头,则永远不会压缩内容。

    可以在进出 GAE 应用程序的实际消息中检查标头(仅在生产中,开发服务器执行压缩)。我看到(在 Firefox 中):

    根据要求:

    接受编码:“gzip,放气”

    关于回复:

    内容编码:“gzip”

    【讨论】:

    • 我知道这一点。我注意到,编码不良或老化的机器人似乎是不要求压缩内容的主要请求者。他们甚至伪造了User-Agent。我宁愿拒绝这些客户访问,也不愿提供吃配额的内容。至于 Accept-Encoding 标头,它并没有达到应用程序本身。我想这是 Google 处理压缩的一部分。
    • 没关系。但是,问题是:应用程序是否有任何其他方式来检测请求的压缩(或检测到 GAE 会应用压缩)?
    • 您可以在robots.txt 中阻止此类机器人,或者,如果还不够,请为此 IP 设置 DoS 保护
    • @IgorArtamonov 有问题的机器人会忽略 robots.txt,只是不请求压缩不会被视为 DoS 攻击。
    【解决方案2】:

    我目前的解决方案是使用另一台服务器来检测压缩。

    我已将我的页面分解为初始化存根和内容。存根包含一个位,它导致浏览器向第三方服务器发出请求,仅用于压缩检测。如果通过了,它就会加载并注入内容。

    这不是最优的,但它确实有效,并且在对用户没有重大影响的情况下,将来自不负责任的机器人的流量减少了相当多。

    编辑: 我突然想到可以从客户端推断出这一点。使用 AJAX 并检查 gzipContent-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
    });
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 2021-10-08
      • 2012-09-03
      • 2020-07-26
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      相关资源
      最近更新 更多