[php] HTTP 414 “요청 URI가 너무 김”오류를 해결하려면 어떻게합니까?

PHP 웹 앱을 개발했습니다. 사용자에게 한 번에 여러 문제를 업데이트 할 수있는 옵션을 제공하고 있습니다. 이 과정에서 때때로 사용자에게이 오류가 발생합니다. 아파치에서 URL 길이를 늘리는 방법이 있습니까?



답변

Apache에서 제한은 구성 가능한 값인 LimitRequestLine. 더 긴 요청 URI를 지원하려면이 값을 기본값 인 8190보다 큰 값으로 변경하십시오. 값은 /etc/apache2/apache2.conf에 있습니다. 그렇지 않은 경우 LimitRequestLine 10000아래에 새 줄 ( )을 추가합니다 AccessFileName .htaccess.

그러나 실제로이 한도에 도달하면 처음 GET부터 악용 하는 것일 수 있습니다 . POST이러한 종류의 데이터를 전송 하는 데 사용해야 합니다. 특히 값을 업데이트하는 데 사용하고 있다는 것을 인정하기 때문에 특히 그렇습니다. 위의 링크를 확인하면 아파치가 “정상 조건에서는 기본값에서 값을 변경해서는 안됩니다.”라고 말하는 것을 알 수 있습니다.


답변

John의 답변에 따라 GET 요청을 POST 요청으로 변경했습니다. 서버 구성을 변경하지 않고도 작동합니다. 그래서 이것을 구현하는 방법을 찾아 보았습니다. 다음 페이지가 도움이되었습니다.

PHP를 사용한 jQuery Ajax POST 예제
(게시 된 데이터 삭제 설명 참고) 및

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 자 이상을 보냈습니다.


답변

간단한 해결 방법이 있습니다.

URI stringdata에 너무 긴 문자열이 있다고 가정합니다 . 서버의 한계에 따라 간단히 여러 부분으로 나눌 수 있습니다. 그런 다음 첫 번째 파일을 제출하십시오. 제 경우에는 파일을 작성하십시오. 그런 다음 이전에 추가 된 데이터에 추가 할 다음 항목을 제출합니다.


답변

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


답변

에서 발췌 RFC 2616 : Hypertext Transfer Protocol-HTTP / 1.1 :

그만큼 POST의 방법은 원본 서버가 Request-Line의 Request-URI가 식별하는 자원의 새로운 부속물로서 요구에 포함 된 엔터티를 접수 할 것을 요구하는 데 사용한다. POST는 균일 한 방법으로 다음 기능을 처리 할 수 ​​있도록 설계되었습니다.

  • 기존 자원의 주석
  • 게시판, 뉴스 그룹, 메일 링리스트 또는 유사한 기사 그룹에 메시지 게시
  • 양식 제출 결과와 같은 데이터 블록을 데이터 처리 프로세스에 제공 .
  • 추가 작업을 통해 데이터베이스 확장.

답변