2

好吧,这很奇怪。

快速总结:我正在使用 SilverStripe CMS,它通过一组 ajax 延迟加载面板在其管理中加载 UI。这一切在开发中都很好用。用于获取主面板数据的 ajax 调用在两者中都有效。也就是说,它在开发服务器和生产服务器上返回数据(在这种情况下为 html),代码为 200(Firebug 说)。

现在,在处理程序中有一个成功、错误和完整的函数——成功获取数据并创建主内容面板。在我的本地开发服务器上,成功和完全火都很好。但是在生产中,只有完整的火灾,即使我可以用 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 走得那么远。另外,我将在生产中关闭压缩和 pagespeed 模块,看看是否有效果,因为 dev 没有这些功能。

$.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');
}
});
4

1 回答 1

1

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

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

我在 pagespeed 之前和之后都通过 w3c 验证器运行了这些片段,并且存在相同的三个错误。所以最后我不确定pagespeed到底是如何搞砸的,我只知道它是值得的。

于 2012-08-02T17:37:21.913 回答