【发布时间】:2016-01-14 02:16:52
【问题描述】:
通常会通过检查 Accept-Encoding 请求标头来检测是否请求了压缩。 Google App Engine 会去除此标头。有没有其他方法可以检测到这种事情?我想知道 GAE 是否会在发送特定响应之前对其进行压缩。
【问题讨论】:
通常会通过检查 Accept-Encoding 请求标头来检测是否请求了压缩。 Google App Engine 会去除此标头。有没有其他方法可以检测到这种事情?我想知道 GAE 是否会在发送特定响应之前对其进行压缩。
【问题讨论】:
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”
【讨论】:
robots.txt 中阻止此类机器人,或者,如果还不够,请为此 IP 设置 DoS 保护
我目前的解决方案是使用另一台服务器来检测压缩。
我已将我的页面分解为初始化存根和内容。存根包含一个位,它导致浏览器向第三方服务器发出请求,仅用于压缩检测。如果通过了,它就会加载并注入内容。
这不是最优的,但它确实有效,并且在对用户没有重大影响的情况下,将来自不负责任的机器人的流量减少了相当多。
编辑: 我突然想到可以从客户端推断出这一点。使用 AJAX 并检查 gzip 的 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
});
【讨论】: