jquery ajax $.post自动变GET的解决方式(for CI)

    |     2017年7月25日   |   学习偶记   |     评论已关闭   |    2288

环境:CI 3.x + windows 2008 + phpstudy + jquery 1.7.2 + apache

以往一直用lnmp,这次用windows+apache,遇到了一些问题,记录下来。

将本地的文件上传到服务器上以后,有一个将大段html提交到服务器处理的代码,是用jquery的$.post方式提交的。

本地运行没有问题,但是服务器上报错:HTTP 414 “Request URI too long” 表单提交内容太多 。

本地是win7 + phpstudy。。。服务器上同样是phpstudy。。为什么服务器会报错呢?

针对Apache 414错误,网上的解决方式:

LimitRequestLine 指令

设置HTTP请求行的字节数限制。

LimitRequestLine指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以LimitRequestLine指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET请求中所传递的查询部分的所有信息。

这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

LimitRequestFieldSize 指令

指定HTTP请求头允许的字节大小。
LimitRequestFieldSize指令允许服务器管理员增加或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。SPNEGO的认证头最大可能达到12392字节。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

Apache的默认值为8K,直接在httpd.conf中添加即可,如

  1. LimitRequestLine 32k  
  2. LimitRequestFieldSize 32k  

以上文章有两点需要注意的地方:

A、

  • LimitRequestLine 32k  
  • LimitRequestFieldSize 32k 

需要添加在listen 80 下面。

B、估计对于更高的Apache版本。32K字样不支持。直接改成字节数。我改成4090000(两个都改)后成功提交。

我在添加apache这两个参数之前,发现我的$.post提交到服务器时候,变成了get方式。而我这个ajax提交的是同一个域名,不存在跨域问题,不过我的post里是设置的josn。改成$.ajax方式,

dataType: "json"
type: "post"
依旧不行。

经过摸索,发现需要将CI的config配置文件中,
$config['uri_protocol'] = 'REQUEST_URI';
修改为:
$config['uri_protocol'] = 'PATH_INFO';

$.ajax提交才显示post方式。最后修改了一下Apache的limitRequestLine 和 LimitReuqestFieldSize后才去掉414错误。

———————————————后记————————————————–

经过一段时间琢磨,发现不是$config[‘uri_protocol’] = ‘REQUEST_URI’;的问题,现在我用的是$config[‘uri_protocol’] = ‘REQUEST_URI’;方式,不会出现post变get了。但是如何解决的,竟然忘记了!!!

仔细回想了一下,大概是提交的时候,用的相对路径的原因吧。请大家尝试一下。

噢!评论已关闭。