web-dev-qa-db-ja.com

HTTP 414「リクエストURIが長すぎます」エラーを解決するにはどうすればよいですか?

PHP Webアプリを開発しました。複数の問題を一度に更新するオプションをユーザーに提供しています。その際、ユーザーがこのエラーに遭遇することがあります。 ApacheでURLの長さを増やす方法はありますか?

93
JPro

Apacheでは、制限は構成可能な値LimitRequestLineです。より長いリクエストURIをサポートする場合は、この値をデフォルトの8190より大きい値に変更します。値は/ etc/Apache2/Apache2.confにあります。そうでない場合は、LimitRequestLine 10000の下に新しい行(AccessFileName .htaccess)を追加します。

ただし、実際にこの制限に達した場合は、おそらくGETを最初から悪用していることに注意してください。この種のデータを送信するには、POSTを使用する必要があります。特に、値を更新するためにそれを使用していることを認めているためです。上記のリンクを確認すると、Apacheが「通常の状態では、値をデフォルトから変更しないでください」とさえ言うことに気付くでしょう。

148
John Feminella

ジョンの答えに基づいて、GETリクエストをPOSTリクエストに変更しました。サーバー構成を変更することなく機能します。それで、私はこれを実装する方法を探しました。次のページが役に立ちました。

PHPでのjQuery Ajax POSTの例 (投稿されたデータのサニタイズに注意してください)および

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

基本的に、違いはGETリクエストが1つの文字列に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文字以上を送信しました。

13
atmelino

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!");
    });
3
Fusca Software

簡単な回避策があります。

URIの文字列stringdataが長すぎると仮定します。サーバーの制限に応じて、単純にいくつかの部分に分割できます。次に、最初のファイルを送信します。私の場合は、ファイルを書き込みます。次に、前に追加したデータに追加する次のものを送信します。

1
Shrey Gupta

RFC 2616:Hypertext Transfer Protocol-HTTP/1.1からの抜粋

POSTメソッドは、リクエストに含まれるエンティティを、Request-で識別されるリソースの新しい部下として、Originサーバーが受け入れることをリクエストするために使用されますリクエストラインのURI。 POSTは、次の機能をカバーする統一されたメソッドを許可するように設計されています。

  • 既存のリソースの注釈。
  • 掲示板、ニュースグループ、メーリングリスト、または同様の記事グループへのメッセージの投稿。
  • フォームの送信結果などのデータブロックをデータ処理プロセスに提供する;
  • 追加操作によるデータベースの拡張。
1