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


103

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


: 당신은 Windows 서버 및 / 또는 IIS / ASP.NET 응용 프로그램에서 문제를 볼에이 오류가 표시되는 경우 stackoverflow.com/q/23237538/12484
존 슈나이더

답변:


166

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

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


처음에는 POST를 사용해 보았지만 이것은 데이터베이스에 대한 업데이트 작업이며 원래 해당 페이지에 게시 된 값을 사용하여 원래 페이지를 새로 고치고 있습니다.
JPro

8
JPro : 데이터베이스 업데이트는 .NET을 사용하는 정확한 이유입니다 POST. POST를 사용하는 것에 대해 방금 게시 된 필드로 동일한 양식을 채우는 것을 배제 할 수 없으므로 그 의미를 잘 모르겠습니다.
John Feminella

1
@JPro :이 경우 일반적인 기술은 동일한 페이지에 POST하는 것입니다. 페이지 처리기 (GET 및 POST 모두에 대해 동일한 코드 일 수 있음)는 먼저 POST 매개 변수를 확인하고 찾은 경우 처리 한 다음 적절한 값이 채워진 페이지를 반환하며, 이는 업데이트 된 값 ( POST 및 업데이트가 성공한 경우) 또는 원래 값 (GET 인 경우 또는 POST 및 업데이트가 실패한 경우). 업데이트가 실패하면 실패를 설명하는 필드 별 오류 메시지가 표시 될 수도 있습니다.
Mike DeSimone 2012 년

5
나는 이것을 꽤 늦게 알아 냈기 때문에 그것을 공유하고 싶다. LimitRequestLinehttpd.conf 파일에서 단어를 찾을 수없는 경우 원하는 곳에 직접 줄을 추가하십시오. 예 :LimitRequestLine 100000
Jules Colle 2013 년

답변과 설명에 감사드립니다. 당신은 내 하루를 구했습니다. :)
may saghira

16

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


4

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

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


예를 들어 줄 수 있습니까? 당신이 문자열을 분할하는 방법 그것의 사용자가 생성 한 때 볼 수 ...
endyourif

4
매우 저렴한 해결 방법입니다. 도메인 문제를 재고하는 것이 좋습니다!
무하마드 Hewedy

13
이것은 그렇게 많은 반대표를 가질 자격이 없습니다. 여러 요청을 제출하는 것이 허용 가능한 해결 방법이 될 수있는 상황이 분명히 있습니다. 사실, 대답의 질은 약간 낮지 만 SO를 처음 접하는 사용자에게는 기대할 수 있습니다. 아직 "얻지"않은 신규 이주자들에게 반대표를 던지는 대신 약간의 사랑을 보여주고 피드백을 제공합시다!
rinogo 2011

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
이것은 대답 또는 질문입니까?
Takarii 2011

이것은 좋은 빠른 수정입니다. get에서 post로 변경하면 서버 구성 변경없이 긴 URL을 사용할 수 있습니다.
mt025

1

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

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

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

8
이 질문에 대한 답을 알 수 없습니다 ..?
Afr

원본 포스터는 기록이 업데이트되고 있다고 말했습니다. 업데이트의 경우 GET이 아닌 POST 또는 PUT를 사용하는 것이 좋습니다. 그러나 물론 업데이트 전에 표시 할 레코드를 검색 할 때 URL 최대 제한을 초과 한 경우 GET 메서드가 적합하지만이 제한으로 인해 실패 할 수 있습니다. 원래 포스터가이 업데이트 자체가 동안이라고 가정 할 수 있도록 문제가 발생하는 단계에서 언급하지 않았다, 그러나 우리는 ... 확신 할 수 없다
JustAMartin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.