ฉันจะแก้ไขข้อผิดพลาด HTTP 414“ ขอ URI ยาวเกินไป” ได้อย่างไร


103

ฉันได้พัฒนาเว็บแอป PHP ฉันกำลังให้ทางเลือกแก่ผู้ใช้ในการอัปเดตปัญหาต่างๆในครั้งเดียว ในการดำเนินการดังกล่าวบางครั้งผู้ใช้พบข้อผิดพลาดนี้ มีวิธีใดในการเพิ่มความยาวของ URL ใน apache หรือไม่?


หากคุณเห็นข้อผิดพลาดนี้บนเซิร์ฟเวอร์ Windows และ / หรือในแอป IIS / ASP.NET โปรดดูคำถาม: stackoverflow.com/q/23237538/12484
Jon Schneider

คำตอบ:


166

ภายใต้ Apache ขีด จำกัด คือค่าที่กำหนดLimitRequestLineได้ เปลี่ยนค่านี้เป็นค่าที่ใหญ่กว่าค่าเริ่มต้น 8190 หากคุณต้องการรองรับ URI คำขอที่ยาวขึ้น ค่าที่อยู่ใน/etc/apache2/apache2.conf ถ้าไม่เพิ่มบรรทัดใหม่ ( LimitRequestLine 10000) AccessFileName .htaccessภายใต้

อย่างไรก็ตามโปรดทราบว่าหากคุณกำลังพบกับขีด จำกัด นี้คุณอาจGETเริ่มต้นด้วยการละเมิด คุณควรใช้POSTเพื่อส่งข้อมูลประเภทนี้โดยเฉพาะอย่างยิ่งเมื่อคุณยอมรับว่าคุณกำลังใช้ข้อมูลนี้เพื่ออัปเดตค่า หากคุณตรวจสอบลิงก์ด้านบนคุณจะสังเกตเห็นว่า Apache ถึงกับพูดว่า "ภายใต้สภาวะปกติค่าไม่ควรเปลี่ยนไปจากค่าเริ่มต้น"


ฉันลองใช้ POST ในตอนแรก แต่นี่เป็นการดำเนินการอัปเดตบนฐานข้อมูลและฉันกำลังรีเฟรชเพจดั้งเดิมโดยใช้ค่าที่โพสต์ไว้ในเพจนั้น
JPro

8
JPro: POSTการอัพเดตฐานข้อมูลจะมากหรือน้อยเหตุผลที่แน่นอนที่คุณจะใช้ ไม่มีอะไรเกี่ยวกับการใช้ POST ที่ขัดขวางไม่ให้คุณกรอกแบบฟอร์มเดียวกันกับฟิลด์ที่เพิ่งโพสต์ดังนั้นฉันไม่แน่ใจว่าคุณหมายถึงอะไร
John Feminella

1
@JPro: เทคนิคปกติในกรณีนั้นคือการ POST ไปที่หน้าเดียวกัน ตัวจัดการสำหรับเพจ (ซึ่งอาจเป็นรหัสเดียวกันสำหรับทั้ง GET และ POST) ก่อนอื่นจะตรวจหาพารามิเตอร์ POST จัดการหากพบจากนั้นจะส่งคืนเพจพร้อมกับค่าที่ถูกต้องซึ่งจะเป็นค่าที่อัปเดต ( หาก POST และการอัปเดตสำเร็จ) หรือค่าดั้งเดิม (หาก GET หรือหาก POST และการอัปเดตล้มเหลว) หากการอัปเดตล้มเหลวคุณยังสามารถมีข้อความแสดงข้อผิดพลาดต่อฟิลด์ที่อธิบายถึงความล้มเหลว
Mike DeSimone

5
ฉันคิดออกว่ามันค่อนข้างช้าฉันจึงอยากจะแบ่งปัน หากคุณไม่พบคำLimitRequestLineในไฟล์ httpd.conf ของคุณเพียงแค่เพิ่มบรรทัดได้ทุกที่ที่คุณต้องการ ตัวอย่างเช่น:LimitRequestLine 100000
Jules Colle

ขอบคุณสำหรับคำตอบและคำอธิบายคุณช่วยชีวิตฉันไว้ :)
อาจ saghira

16

จากคำตอบของ John ฉันเปลี่ยนคำขอ GET เป็นคำขอ POST ใช้งานได้โดยไม่ต้องเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์ ดังนั้นฉันจึงไปหาวิธีใช้สิ่งนี้ หน้าต่อไปนี้มีประโยชน์:

jQuery Ajax POST ตัวอย่างด้วย 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 ตัวโดยไม่มีปัญหาใด ๆ


4

ฉันมีวิธีแก้ปัญหาง่ายๆ

สมมติว่า URI ของคุณมีสตริงstringdataที่ยาวเกินไป คุณสามารถแบ่งมันออกเป็นหลาย ๆ ส่วนขึ้นอยู่กับขีด จำกัด ของเซิร์ฟเวอร์ของคุณ จากนั้นส่งไฟล์แรกในกรณีของฉันเพื่อเขียนไฟล์ จากนั้นส่งรายการถัดไปเพื่อต่อท้ายข้อมูลที่เพิ่มก่อนหน้านี้


คุณสามารถให้ตัวอย่างได้หรือไม่? ฉันสามารถดูว่าคุณแยกสตริงอย่างไรเมื่อผู้ใช้สร้าง ...
endyourif

4
วิธีแก้ปัญหาราคาถูกมาก พิจารณาปัญหาโดเมนใหม่จะดีกว่า!
Muhammad Hewedy

13
สิ่งนี้ไม่สมควรที่จะมีการโหวตลดจำนวนมาก มีบางสถานการณ์ที่การส่งคำขอหลายครั้งอาจเป็นวิธีแก้ปัญหาที่ยอมรับได้ จริงอยู่คุณภาพของคำตอบนั้นต่ำไปเล็กน้อย แต่เป็นที่คาดหวังจากผู้ใช้ที่เพิ่งเริ่มใช้ SO มาแสดงความรักและแสดงความคิดเห็นแทนการลดคะแนนผู้มาใหม่ที่ยังไม่ "รับ" SO!
rinogo

1
ฉันยอมรับมันดูเป็นไปได้
Felipe Valdes

3

ฉันได้รับข้อผิดพลาดนี้หลังจากใช้ $ .getJSON () จาก JQuery ฉันเพิ่งเปลี่ยนเป็นโพสต์:

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

นี่เป็นการแก้ไขด่วนที่ดี การเปลี่ยนจาก get เป็น post ทำให้ URL ยาวโดยไม่ต้องเปลี่ยนการกำหนดค่าเซิร์ฟเวอร์
mt025

1

ข้อความที่ตัดตอนมาจากRFC 2616: Hypertext Transfer Protocol - HTTP / 1.1 :

POSTวิธีการที่ใช้ในการขอให้เซิร์ฟเวอร์ต้นทางยอมรับกิจการที่แนบมาในคำขอเป็นผู้ใต้บังคับบัญชาใหม่ของทรัพยากรที่ระบุโดยขอ URI ในคำขอ-Line POST ได้รับการออกแบบมาเพื่อให้วิธีการเดียวกันครอบคลุมฟังก์ชันต่อไปนี้:

  • คำอธิบายประกอบของทรัพยากรที่มีอยู่
  • การโพสต์ข้อความไปยังกระดานข่าวกลุ่มข่าวสารรายชื่อส่งเมลหรือกลุ่มบทความที่คล้ายกัน
  • ให้บล็อกของข้อมูลดังกล่าวเป็นผลมาจากการส่งแบบฟอร์มเพื่อกระบวนการจัดการข้อมูลที่ ;
  • การขยายฐานข้อมูลผ่านการดำเนินการผนวก

8
ไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไร .. ?
แอฟริกา

ผู้โพสต์คนเดิมบอกว่ากำลังปรับปรุงบันทึก สำหรับการอัปเดตควรใช้ POST หรือ PUT ไม่ใช่ GET แต่แน่นอนอาจเป็นไปได้ว่าเกินขีด จำกัด สูงสุดของ URL เมื่อเรียกข้อมูลระเบียนเพื่อแสดงก่อนการอัปเดตและวิธีการ GET นั้นเหมาะสม แต่อาจล้มเหลวเนื่องจากขีด จำกัด นี้ ผู้โพสต์ต้นฉบับไม่ได้กล่าวถึงปัญหาที่เกิดขึ้นในขั้นตอนใดดังนั้นจึงสามารถสันนิษฐานได้ว่าเป็นระหว่างการอัปเดต แต่เราไม่แน่ใจว่า ...
JustAMartin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.