jQuery成功处理程序未在生产服务器上执行,但在dev中运行良好



好吧,这是一个奇怪的问题。

快速总结:我使用的是SilverStripe CMS,它通过一组ajax惰性加载面板在其管理员中加载UI。这一切在dev中都很有效。获取主面板数据的ajax调用在两者中都有效。也就是说,它在开发服务器和生产服务器上都返回数据(在本例中为html),并返回200代码(正如Firebug所说)。

现在,在处理程序中有一个success、error和complete函数——success获取数据并创建主内容面板。在我的本地开发服务器上,成功和彻底成功都很好。但在生产中,只有完全的火灾,尽管我可以用Firebug看到数据恢复得很好(就像我说的那样,有200个)。为什么没有成功?当然,我可以将成功逻辑移到完成,但此服务器可能会继续产生问题。

以下是Dev-ajax调用的响应标头:

Cache-Control     no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection        Keep-Alive
Content-Length    38407
Content-Type      text/html; charset=utf-8
Date              Thu, 02 Aug 2012 01:02:08 GMT
Expires           Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive        timeout=5, max=100
Pragma            no-cache
Server            Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/1.0.1c DAV/2 PHP/5.3.12
Set-Cookie        PastMember=1; expires=Wed, 31-Oct-2012 01:02:09 GMT; path=/; httponly
X-Controller      CMSPagesController
X-Include-CSS     /framework/admin/thirdparty/jquery-notice/jquery.notice.css?m=1340880397...
X-Include-JS      /framework/thirdparty/jquery/jquery.js?m=1340880400...
X-Powered-By      PHP/5.3.12
X-Title           SilverStripe - Pages

以下是生产中的标题(明显的区别是编码/压缩):

Cache-Control     no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0
Connection        Keep-Alive
Content-Encoding  gzip
Content-Length    2796
Content-Type      text/html; charset=utf-8
Date              Thu, 02 Aug 2012 01:44:20 GMT
Expires           Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive        timeout=2, max=98
Pragma            no-cache
Server            Apache
Set-Cookie        PastMember=1; expires=Wed, 31-Oct-2012 01:44:22 GMT; path=/; httponly
Vary              Accept-Encoding
X-Controller      CMSPagesController
X-Include-CSS     /framework/admin/thirdparty/jquery-notice/jquery.notice.css?m=1342411329...
X-Include-JS      /framework/thirdparty/jquery/jquery.js?m=1342412461...
X-Mod-Pagespeed   0.10.21.2-1381
X-Title           SilverStripe - Pages

为了让事情变得真正奇怪,我可以通过破坏文档来"修复"这种情况。如果在DOCTYPE:.<!DOCTYPE html>之前添加一个字符,则成功处理程序将运行,面板将加载。删除一个字符,面板将不再加载。我被难住了:-/

===编辑===

这是ajax处理程序,非常普通,没有什么特别的。我添加了控制台进行调试。错误从不运行,在开发服务器上只有成功完成,在生产服务器上只有完成。现在我的猜测是,它正试图基于doctype(html5)验证html,但却出现了错误?不过,我认为jQuery没有走那么远。此外,我将在生产中关闭压缩和页面速度模块,看看这是否有效果,因为开发人员没有这些功能。

$.ajax({
url: url,
complete: function() {
    self.removeClass('loading');
    if(window.console) console.log('complete');
},
success: function(data, status, xhr) {
    if(window.console) console.log('success');
    self.html(data);
},
error: function(){
    if(window.console) console.log('error');
}
});

好吧,我终于想通了。问题是apache的一个mod仍在测试版(至少在我的主机上是这样)。您可以在此处阅读有关mod_pagespeed的所有信息:https://developers.google.com/speed/pagespeed/mod

一旦我禁用了它并重新启动了apache、viola、jQuery,就成功地读取了html数据和正确触发的事件,现在面板正在正常加载。为什么?出于某种原因,pagespeed正在进行的"优化"在某一分钟内扼杀了html结构,但显然很重要。

在pagespeed之前和之后,我都通过w3c验证器运行了这些片段,并且出现了同样的三个错误。所以最后我不确定页面速度到底是怎么搞砸的,我只知道这是值得的。

相关内容

最新更新