请求标头字段的大小超出服务器限制

时间:2016-05-28 08:56:27

标签: php android json web-services

我有Android应用程序将JSON数据发送到在 WAMP服务器上运行的php web服务。

当我通过JSON发送许多记录时,我有一个错误:

"Bad Request 
Your browser sent a request that this server could not understand. 
Size of a request header field exceeds server limit."

我更改了 php.ini 中的配置 upload_max_file_size 64M upload_max_filesize 64M

我怎么能解决这个问题?

3 个答案:

答案 0 :(得分:3)

这是因为您的http网络服务(apache?)不​​允许数据超过LimitRequestFieldSize参数的请求(默认为8190字节)

似乎你的一个JSON请求太大或者Cookie数据的总和太大而且web服务阻止了它。

顺便提一下,增加LimitRequestFieldSize并不是一个好主意,因为存在DOS攻击的风险。

尝试最小化/清除您的Cookie,或简化Json请求。

答案 1 :(得分:1)

您尝试使用incrase LimitRequestFieldSize选项httpd.conf或.htaccess文件。

用法在这里:apache docs

答案 2 :(得分:0)

如果您需要传输大数据(例如,在具有JSON的API之间),而不是使用GET请求并在标头中发布数据,请使用POST请求并在正文中发送数据。

使用POST,您仍然可以使用标头来验证令牌或小数据,但再次发布不适合POST正文中标头的大JSON数据。

这是您使用PHP发布JSON数据的完整系统:

### Sender PHP Side:
# Core function that sends big data with POST:
function curl_post($url, $header, $data){
    $CURL = curl_init();
    curl_setopt($CURL, CURLOPT_URL, $url);
    curl_setopt($CURL, CURLOPT_POST, TRUE);
    curl_setopt($CURL, CURLOPT_HTTPHEADER, $header);
    curl_setopt($CURL, CURLOPT_POSTFIELDS, $data);
    curl_setopt($CURL, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($CURL);
    $http_code = curl_getinfo($CURL, CURLINFO_HTTP_CODE);
    curl_close($CURL);
    return array($http_code, $result);
}

# Prepare your data and send:
$url = "https://example.com/api.php";
$header = array(
    "Content-Type: text/html",
    "verify: <your fixed code to verify the request is legit>",
    "anything: <you can send anything with headers here but the text you send should be SMALL>"
);
list($http_code, $result) = curl_post($url, $header, json_encode($your_big_data));
echo "http_code: $http_code<br>result: $result";

###########################

### Receiver PHP Side: (api.php in our example)
if (function_exists("apache_request_headers")) {$myHeaders = apache_request_headers();}

# See the headers you posted from other side:
print_r($myHeaders);

# See the JSON POST body you posted from other side:
echo file_get_contents('php://input');