日期:2014-05-16  浏览次数:20661 次

一个AJAX程序提交时本地正常,服务不正常??
http://xq.szlilai.com/web/
像这个页面点最顶上的‘登录’按钮。
弹出框,输入已经存在的帐号:test100,密码:123456.
现在没有反应,查看IE8里有JS出错信息:
页错误详细信息

用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322)
时间戳: Sat, 14 Sep 2013 03:24:24 UTC


消息: '0' 为空或不是对象
行: 798
字符: 4
代码: 0
URI: http://xq.szlilai.com/web/tpl/static/zh_cn/js/handle.js

于是打开这个JS,打开看这一行是:
var msg  = json[0].msg;

原来是一个AJAX提交。网站其他很多地方有AJAX提交的都有问题。

但是这个程序在本地电脑上运行,很正常 。怪了。

服务器的问题?还是AJAX的环境问题。求解。
AJAX环境问题

------解决方案--------------------
这个是服务器配置的问题。本地上是Apache是可以用的。线上的可能是Nginx。
Nginx的http模块在处理HTTP请求时对环境变量的封装与Apache有所不同。除了支持一些与HTTP协议相关的通用的变量之外,还支持一系列Nginx自有的变量,如Nginx配置目录下fastcgi_params.default文件里的$server_protocol、$nginx_version等。正如这个文件中的示例的用途,这些变量可以在配置fastcgi时传递给cgi程序,使其可以作为cgi程序的环境变量来使用。然而,即便是Nginx有了这些自有的变量也无法完全满足所有的需求。

了解Jquery的朋友会发现,Jquery在实现Ajax时会通过setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’)方法自动添加一个值为“xmlhttprequest”自定义的请求头”X-Requested-With”来标识这是一个Ajax请求,以期处理这个请求的后端能够通过判断这个标识来识别请求类型。那么这个时候PHP是如何来获取这个自定义参数的值的呢?

熟悉Apache和PHP的人一定会第一时间想到$_SERVER["HTTP_X_REQUESTED_WITH"],不错,这对黄金搭配早就把这个问题给完美解决了,但Nginx却不然,这是由Nginx对其自身工作的定位决定的——Nginx只负责HTTP。在Nginx眼里,PHP只是它的一个后端,形象点来说,它只管分发请求,而不管发给谁。这就意味着,我们无法期待Nginx像Apache一样给我们自动完成一些自定义参数到PHP的传递,只有自力更生。简单点说就是,想要直接像$_SERVER["HTTP_X_REQUESTED_WITH"]这样来调用自定义请求头参数的值的话,你就必须手工将其添加到fastcgi_params的配置中,明确告知cgi程序接收,否则Nginx会将其遗弃。

配置环境变量的方法可参照fastcgi_params.default这个文件,在前面的博客“Nginx下虚拟主机环境变量的配置方法”中也提到过。针对上述例子,只需在fastcgi_params文件中增加一行即可:

?12 # for Ajax fastcgi_param       HTTP_X_REQUESTED_WITH       $http_x_requested_with; 
这样,重载Nginx配置后就可以之间在PHP中调用$_SERVER["HTTP_X_REQUESTED_WITH"]来判断请求类型了。其中需要注意以下两点:

一、自定义请求头部的名称不应该包括空白、冒号、换行和下划线。

Nginx在处理客户端请求header头时,会将名称中的中横线”-”替换为下划线”_”,并将所有字母小写再加上”$http_”来作为该名称对应的变量名。例如上述Jquery的例子中setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’),在HTTP请求头中为一行字符串:”X-Requested-With: xmlhttprequest”,经Nginx处理后将自动生成一个名为$http_x_requested_with的变量,其值为”xmlhttprequest”。尤其注意中横线”-”替换为下划线”_”这个规则,这意味着请求参数名称中如果含有下划线,Nginx将无法正确识别。

二、$_SERVER["HTTP_X_REQUESTED_WITH"]中的索引,也即“fastcgi_param       HTTP_X_REQUESTED_WITH $http_x_requested_with;”中加红部分,是可以自由命名的,当前这种命名格式是为了保持和Apache保持一致。

看百度这个内容:http://zhidao.baidu.com/link?url=XaxZ_PqJTKr-Qo8NyXwEDy41gqp3mmT5k4J6kxEAvQwmFeB7tdudz65zdHB7d1ejJhVA4otH_QAnVVaHjD352K&qq-pf-to=pcqq.group