मैं एक HTTP 414 "अनुरोध URI बहुत लंबी" त्रुटि कैसे हल करूं?


103

मैंने एक PHP वेब ऐप विकसित किया है। मैं उपयोगकर्ता को एक बार में कई मुद्दों को अपडेट करने का विकल्प दे रहा हूं। ऐसा करने में, कभी-कभी उपयोगकर्ता इस त्रुटि का सामना कर रहा है। क्या अपाचे में URL की लैंथ बढ़ाने का कोई तरीका है?


यदि आप Windows सर्वर और / या IIS / ASP.NET ऐप में यह त्रुटि देख रहे हैं, तो प्रश्न देखें: stackoverflow.com/q/23237538/12484
जॉन श्नाइडर

जवाबों:


166

अपाचे के तहत, सीमा एक विन्यास योग्य मूल्य है LimitRequestLine,। यदि आप URI के लंबे अनुरोध का समर्थन करना चाहते हैं, तो इस मान को 8190 के अपने डिफ़ॉल्ट से कुछ बड़ा करें। मान /etc/apache2/apache2.conf में है । यदि नहीं, तो एक नई पंक्ति ( LimitRequestLine 10000) जोड़ें AccessFileName .htaccess

हालांकि, ध्यान दें कि यदि आप वास्तव में इस सीमा में चल रहे हैं, तो आप शायद GETशुरू करने के लिए दुर्व्यवहार कर रहे हैं । आपको POSTइस तरह के डेटा को प्रसारित करने के लिए उपयोग करना चाहिए - विशेष रूप से तब तक जब आप मान भी लेते हैं कि आप इसका उपयोग मूल्यों को अपडेट करने के लिए कर रहे हैं। यदि आप ऊपर दिए गए लिंक की जांच करते हैं, तो आप देखेंगे कि अपाचे भी कहता है "सामान्य परिस्थितियों में, मान को डिफ़ॉल्ट से नहीं बदला जाना चाहिए।"


मैंने पहली बार POST का उपयोग करने की कोशिश की, लेकिन यह डेटाबेस पर एक अपडेट ऑपरेशन है, और मैं मूल पृष्ठ को मूल रूप से उस पृष्ठ पर पोस्ट किए गए मानों का उपयोग करके ताज़ा कर रहा हूं।
जेपीआरओ

8
JPro: डेटाबेस को अपडेट करना कम या ज्यादा सटीक कारण है जिसका आप उपयोग करेंगे POST। POST का उपयोग करने के बारे में कुछ भी नहीं है जो आपको अभी पोस्ट किए गए फ़ील्ड के साथ उसी फॉर्म को पॉप्युलेट करने से रोकता है, इसलिए मुझे यकीन नहीं है कि आप इसका क्या मतलब है।
जॉन फेमिनाला

1
@JPro: इस मामले में सामान्य तकनीक उसी पृष्ठ पर पोस्ट करने के लिए है। पृष्ठ के लिए हैंडलर (जो GET और POST दोनों के लिए समान कोड हो सकता है) पहले POST मापदंडों के लिए जाँच करता है, उन्हें संभालता है यदि यह उन्हें मिल जाता है, तो पृष्ठ को भरे हुए उचित मानों के साथ लौटा देता है, जो या तो अद्यतन मान होंगे ( यदि POST और अपडेट सफल होता है) या मूल मान (यदि GET, या यदि POST और अपडेट विफल रहता है)। यदि अद्यतन विफल रहता है, तो आपके पास विफलता का वर्णन करने वाले प्रति-फ़ील्ड त्रुटि संदेश भी हो सकते हैं।
माइक डीसिमोन

5
मुझे यह बहुत देर से पता चला, इसलिए मैं इसे साझा करना चाहूंगा। यदि आप LimitRequestLineअपनी httpd.conf फ़ाइल में कहीं भी शब्द नहीं ढूँढ सकते हैं , तो बस अपने आप को कहीं भी अपनी इच्छानुसार पंक्ति जोड़ें। उदाहरण के लिए:LimitRequestLine 100000
जूल्स कोल

उत्तर और स्पष्टीकरण के लिए धन्यवाद, आपने मेरा दिन बचाया। :)
माघ

16

जॉन के जवाब के आधार पर, मैंने GST अनुरोध को POST अनुरोध में बदल दिया। यह सर्वर कॉन्फ़िगरेशन को बदलने के बिना काम करता है। इसलिए मैं देख रहा था कि इसे कैसे लागू किया जाए। निम्नलिखित पृष्ठ सहायक थे:

PHP के साथ jQuery का अजाक्स POST उदाहरण (पोस्ट की गई टिप्पणी को साफ करें) और

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

मूल रूप से, अंतर यह है कि GET अनुरोध में एक स्ट्रिंग में url और पैरामीटर होते हैं और फिर शून्य भेजते हैं:

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है जो बहुत लंबी है। आप बस अपने सर्वर की सीमा के आधार पर इसे कई हिस्सों में तोड़ सकते हैं। फिर फ़ाइल लिखने के लिए मेरे मामले में पहले एक को जमा करें। फिर पहले वाले डेटा में जोड़ने के लिए अगले लोगों को जमा करें।


क्या आप एक उदाहरण प्रदान कर सकते हैं? मैं यह देख सकता हूं कि जब आप उपयोगकर्ता उत्पन्न होते हैं तो आप स्ट्रिंग को कैसे विभाजित करते हैं ...
1

4
बहुत सस्ता वर्कअराउंड। डोमेन समस्या पर पुनर्विचार करना बेहतर है!
मुहम्मद Hewedy

13
यह इतने सारे डाउनवोट के लायक नहीं है। निश्चित रूप से ऐसी स्थितियां हैं जिनमें कई अनुरोध सबमिट करना एक स्वीकार्य समाधान हो सकता है। सच है, जवाब की गुणवत्ता थोड़ी कम है, लेकिन यह उस उपयोगकर्ता से उम्मीद की जानी चाहिए जो एसओ के लिए बिल्कुल नया है। चलो कुछ प्यार दिखाने के लिए और सिर्फ नए लोगों को नीचा दिखाने के बजाय प्रतिक्रिया दें जो अभी तक "नहीं" मिले!
रिनोगो

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
यह एक उत्तर या प्रश्न है?
तिकारी

यह एक अच्छा त्वरित सुधार है। किसी भी सर्वर कॉन्‍फ़िगर परिवर्तन के बिना लंबे समय से URL प्राप्त करने की अनुमति देता है।
mt025

1

RFC 2616 का एक अंश : हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल - HTTP / 1.1 :

पोस्ट विधि अनुरोध करने के लिए प्रयोग किया जाता है कि मूल सर्वर इकाई संसाधन अनुरोध लाइन में अनुरोध- URI द्वारा की पहचान की एक नई अधीनस्थ के रूप में अनुरोध में संलग्न स्वीकार करते हैं। POST को एक समान विधि को निम्नलिखित कार्यों को कवर करने की अनुमति देने के लिए डिज़ाइन किया गया है:

  • मौजूदा संसाधनों की व्याख्या;
  • बुलेटिन बोर्ड, समाचार समूह, मेलिंग सूची या लेखों के समान समूह को संदेश पोस्ट करना;
  • डेटा का एक ब्लॉक प्रदान करना, जैसे कि डेटा जमा करने की प्रक्रिया के लिए फ़ॉर्म सबमिट करना ;
  • एक परिशिष्ट ऑपरेशन के माध्यम से एक डेटाबेस का विस्तार।

8
यह नहीं देखा कि यह सवाल का जवाब कैसे देता है ..?
अफर

मूल पोस्टर में कहा गया है कि रिकॉर्ड अपडेट किए जा रहे हैं। अपडेट के लिए, POST या PUT का उपयोग करना अच्छा है और GET नहीं। लेकिन, निश्चित रूप से, यह हो सकता है कि अपडेट करने से पहले रिकॉर्ड प्राप्त करने के लिए URL अधिकतम सीमा पार हो जाए, और फिर GET विधि उपयुक्त हो, लेकिन यह इस सीमा के कारण विफल हो सकता है। मूल पोस्टर में यह उल्लेख नहीं किया गया था कि समस्या किस स्तर पर है, इसलिए यह माना जा सकता है कि यह अपडेट के दौरान ही था, लेकिन हम निश्चित नहीं हो सकते ...
जस्टमार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.