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


103

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


WindowsサーバーまたはIIS / ASP.NETアプリでこのエラーが発生した場合は、質問を参照してください:stackoverflow.com/q/23237538/12484
Jon Schneider

回答:


166

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

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


最初はPOSTを使用してみましたが、これはデータベースの更新操作であり、元のページに元々投稿されていた値を使用して元のページを更新しています。
JPro 2010年

8
JPro:データベースの更新は、多かれ少なかれ使用する正確な理由ですPOST。POSTの使用については、投稿されたばかりのフィールドを同じフォームに入力することを妨げるものは何もないため、それが何を意味するのかわかりません。
John Feminella、

1
@JPro:その場合の通常の手法は、同じページにPOSTすることです。ページのハンドラー(GETとPOSTの両方で同じコードにすることができます)は、最初にPOSTパラメーターをチェックし、見つかった場合はそれらを処理してから、適切な値が入力されたページを返します。 POSTと更新が成功した場合)または元の値(GETの場合、またはPOSTと更新が失敗した場合)。更新が失敗した場合、失敗を説明するフィールドごとのエラーメッセージを表示することもできます。
Mike DeSimone 2012

5
これはかなり遅くなってわかったので、共有したいと思います。LimitRequestLinehttpd.confファイルのどこにも単語が見つからない場合は、自分で好きな場所に行を追加してください。例:LimitRequestLine 100000
Jules Colle

答えと説明をありがとう、あなたは私の日を救った。:)
5

16

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

PHPでのjQuery Ajax POSTの例 (サニタイズされた投稿データの注釈に注意)

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

基本的に、GETリクエストはURLとパラメータを1つの文字列にしてから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文字以上送信しました。


4

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

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


例を挙げていただけますか?ユーザーが生成した文字列を分割する方法を確認できます...
endyourif

4
非常に安価な回避策。ドメインの問題を再検討することをお勧めします!
Muhammad Hewedy 2014

13
これは、それほど多くの反対票を持つに値しません。確かに、複数のリクエストを送信することで問題を回避できる場合があります。確かに、答えの質は少し低いですが、それはSOの真新しいユーザーから期待されるものです。まだ「ゲット」していない新参者に反対投票するのではなく、愛を示してフィードバックを提供しましょう!
rinogo 2016年

1
私は同意します、それは実行可能に見えます
フェリペバルデス

3

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

2
これは回答または質問ですか?
宝井

これはすぐに修正できます。getからpostに変更すると、サーバー構成を変更せずに長いURLを使用できます。
mt025 2017年

1

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

POSTのメソッドは、オリジンサーバがリクエストライン中のRequest-URIによって識別されるリソースの新しい従属として、リクエストに囲まれたエンティティを受け入れることを要求するために使用されます。POSTは、以下の機能をカバーする統一された方法を可能にするように設計されています。

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

8
これが質問にどのように答えるかがわかりません。
2014年

元のポスターは、記録が更新されていると述べました。更新の場合、GETではなくPOSTまたはPUTを使用することをお勧めします。ただし、もちろん、更新する前に表示するレコードを取得するときにURLの最大制限を超え、GETメソッドが適切な場合もありますが、この制限のために失敗する可能性があります。元の投稿者は、問題が発生する段階について言及していなかったため、更新自体が原因であると想定できますが、確信はありません...
JustAMartin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.