如何解决 HTTP414“ RequestURI too long”错误?

我已经开发了一个 PHP 网络应用程序。我给用户一个选项,以更新多个问题的一去。这样做时,用户有时会遇到此错误。有什么办法可以增加网址的长度在阿帕奇?

388387 次浏览

在 Apache 下,限制是一个可配置的值 LimitRequestLine。如果希望支持更长的请求 URI,请将此值更改为大于默认值8190的值。值在 /etc/apache2/apache2.conf中。如果没有,在 AccessFileName .htaccess下面添加一个新行(LimitRequestLine 10000)。

但是,请注意,如果您实际上正在运行到这个限制,那么您可能从一开始就在滥用 GET。您应该使用 POST来传输这类数据——特别是因为您甚至承认正在使用它来更新值。如果检查上面的链接,您会注意到 Apache 甚至说: “在正常情况下,值不应该从默认值更改。”

摘自 Rfc2616: 超文本传输协议—— HTTP/1.1

职位方法用于请求原始服务器接受 作为资源的一个新的从属实体包含在请求中 由请求行中的 Request-URI 标识 使统一方法能够涵盖下列职能:

  • 现有资源的注释;
  • 向公告板、新闻组、邮件列表发布消息, 或类似组别的物品;
  • 提供数据块,例如提交 表单,到一个数据处理过程 ;
  • 通过追加操作扩展数据库。

我有个简单的解决办法。

假设您的 URI 有一个太长的字符串 stringdata。您可以根据服务器的限制将其分成若干部分。然后提交第一个,在我的情况下写一个文件。然后提交下一个附加到以前添加的数据。

Based on John's answer, I changed the GET request to a POST request. It works, without having to change the server configuration. So I went looking how to implement this. The following pages were helpful:

JQueryAjaxPOST 示例与 PHP (注意消毒贴出的数据备注)和

http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

基本上,区别在于 GET 请求在一个字符串中包含 url 和参数,然后发送 null:

http.open("GET", url+"?"+params, true);
http.send(null);

而 POST 请求则以单独的命令发送 url 和参数:

http.open("POST", url, true);
http.send(params);

下面是一个可行的例子:

返回文章页面

<html>
<head>
<script type="text/javascript">
function ajaxPOSTTest() {
try {
// Opera 8.0+, Firefox, Safari
ajaxPOSTTestRequest = new XMLHttpRequest();
} catch (e) {
// Internet Explorer Browsers
try {
ajaxPOSTTestRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
ajaxPOSTTestRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
// Something went wrong
alert("Your browser broke!");
return false;
}
}
}


ajaxPOSTTestRequest.onreadystatechange = ajaxCalled_POSTTest;
var url = "ajaxPOST.php";
var params = "lorem=ipsum&name=binny";
ajaxPOSTTestRequest.open("POST", url, true);
ajaxPOSTTestRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajaxPOSTTestRequest.send(params);
}


//Create a function that will receive data sent from the server
function ajaxCalled_POSTTest() {
if (ajaxPOSTTestRequest.readyState == 4) {
document.getElementById("output").innerHTML = ajaxPOSTTestRequest.responseText;
}
}
</script>


</head>
<body>
<button onclick="ajaxPOSTTest()">ajax POST Test</button>
<div id="output"></div>
</body>
</html>

ajaxPOST.php:

<?php


$lorem=$_POST['lorem'];
print $lorem.'<br>';


?>

我刚刚发送了超过12000个字符,没有任何问题。

在使用来自 JQuery 的 $. getJSON ()之后,我得到了这个错误:

data = getDataObjectByForm(form);
var jqxhr = $.post(url, data, function(){}, 'json')
.done(function (response) {
if (response instanceof Object)
var json = response;
else
var json = $.parseJSON(response);
// console.log(response);
// console.log(json);
jsonToDom(json);
if (json.reload != undefined && json.reload)
location.reload();
$("body").delay(1000).css("cursor", "default");
})
.fail(function (jqxhr, textStatus, error) {
var err = textStatus + ", " + error;
console.log("Request Failed: " + err);
alert("Fehler!");
});