好吧,这很奇怪。
快速总结:我正在使用 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');
}
});