【问题标题】:How do I resolve a HTTP 414 "Request URI too long" error?如何解决 HTTP 414“请求 URI 太长”错误?
【发布时间】:2011-02-22 21:50:35
【问题描述】:

我开发了一个 PHP 网络应用程序。我为用户提供了一次更新多个问题的选项。这样做时,有时用户会遇到此错误。有什么办法可以增加 apache 中 URL 的长度?

【问题讨论】:

标签: php apache http-status-codes


【解决方案1】:

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

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

【讨论】:

  • 我一开始尝试使用 POST,但这是对数据库的更新操作,我正在使用最初发布到该页面的值刷新原始页面。
  • JPro:更新数据库或多或少是您使用POST 的确切原因。使用 POST 不会阻止您使用刚刚发布的字段填充相同的表单,所以我不确定您的意思。
  • @JPro:在这种情况下,通常的技术是 POST 到同一页面。页面的处理程序(对于 GET 和 POST 可以是相同的代码)首先检查 POST 参数,如果找到它们就处理它们,然后返回填充了正确值的页面,这将是更新的值 (如果 POST 并且更新成功)或原始值(如果 GET,或者如果 POST 并且更新失败)。如果更新失败,您甚至可以获得描述失败的每个字段的错误消息。
  • 我很晚才发现这一点,所以我想分享一下。如果您在 httpd.conf 文件中的任何位置都找不到单词LimitRequestLine,只需在您喜欢的任何位置添加该行即可。例如:LimitRequestLine 100000
  • “无法修复”什么也没告诉我。另外,我不确定 Apache 是否允许 100k 请求行;这是一个非常大的尺寸。如果您有这么多查询参数,您可能需要重新考虑您的方法,并使用除 GET 之外的其他方法。
【解决方案2】:

根据 John 的回答,我将 GET 请求更改为 POST 请求。它可以工作,无需更改服务器配置。所以我去寻找如何实现这一点。以下页面很有帮助:

jQuery Ajax POST example with 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);

这是一个工作示例:

ajaxPOST.html:

<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>';

?>

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

【讨论】:

    【解决方案3】:

    我有一个简单的解决方法。

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

    【讨论】:

    • 你能举个例子吗?我可以看到您在用户生成字符串时如何拆分它...
    • 非常便宜的解决方法。最好重新考虑域问题!
    • 这不值得这么多反对。在某些情况下,提交多个请求可能是一种可接受的解决方法。诚然,答案的质量有点低,但对于 SO 的全新用户来说,这是可以预料的。让我们表达一些爱并提供反馈,而不是仅仅对尚未“获得” SO 的新人投反对票!
    • 我同意,它看起来可行
    【解决方案4】:

    在使用 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!");
        });
    

    【讨论】:

    • 这是答案还是问题?
    • 这是一个很好的快速修复。从 get 更改为 post 允许长 URL 而无需任何服务器配置更改。
    【解决方案5】:

    摘自RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1:

    POST 方法用于请求源服务器接受 包含在请求中的实体作为资源的新下属 由 Request-Line 中的 Request-URI 标识。 POST是设计的 允许统一的方法涵盖以下功能:

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

    【讨论】:

    • 没有看到这如何回答问题..?
    • 原帖者说记录正在更新中。对于更新,最好使用 POST 或 PUT 而不是 GET。但是,当然,在更新之前检索要显示的记录时,可能会超出 URL 最大限制,然后 GET 方法是合适的,但它可能会因为这个限制而失败。原贴没有提到问题出现在哪个阶段,所以可以推测是更新本身的时候,但我们不能确定……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多