আমি কীভাবে এইচটিটিপি 414 "অনুরোধ ইউআরআই খুব দীর্ঘ" ত্রুটিটি সমাধান করব?


103

আমি একটি পিএইচপি ওয়েব অ্যাপ্লিকেশন তৈরি করেছি। আমি একযোগে একাধিক সমস্যা আপডেট করার জন্য ব্যবহারকারীকে একটি বিকল্প দিচ্ছি। এটি করতে গিয়ে, কখনও কখনও ব্যবহারকারী এই ত্রুটির মুখোমুখি হন। অ্যাপাচে URL এর দৈর্ঘ্য বাড়ানোর কোনও উপায় আছে কি?


আপনি যদি এই ত্রুটিটি কোনও উইন্ডোজ সার্ভারে এবং / অথবা কোনও আইআইএস / এএসপি.এনইটি অ্যাপ্লিকেশনটিতে দেখতে পান তবে প্রশ্ন দেখুন: stackoverflow.com/q/23237538/12484
জন স্নাইডার

উত্তর:


166

অ্যাপাচে অধীনে, সীমাটি একটি কনফিগারযোগ্য মান LimitRequestLine,। আপনি যদি দীর্ঘতর অনুরোধ ইউআরআই সমর্থন করতে চান তবে এই মানটিকে 8190 এর ডিফল্টের চেয়ে বড় কিছুতে পরিবর্তন করুন। মানটি /etc/apache2/apache2.conf এ রয়েছে । যদি তা না হয় তবে এর LimitRequestLine 10000অধীনে একটি নতুন লাইন যুক্ত করুন AccessFileName .htaccess

তবে নোট করুন যে আপনি যদি এই সীমাটিতে চলে যান তবে আপনি সম্ভবত এটিকে গালাগাল GETকরছেন। আপনার POSTএই ধরণের ডেটা প্রেরণ করার জন্য ব্যবহার করা উচিত - বিশেষত যেহেতু আপনি স্বীকারও করেন যে আপনি মানগুলি আপডেট করার জন্য এটি ব্যবহার করছেন। যদি আপনি উপরের লিঙ্কটি পরীক্ষা করেন তবে আপনি খেয়াল করবেন যে অ্যাপাচি এমনকি "সাধারণ পরিস্থিতিতে, মানটি ডিফল্ট থেকে পরিবর্তন করা উচিত নয়।"


আমি প্রথমে POST ব্যবহার করার চেষ্টা করেছি, তবে এটি ডাটাবেজে আপডেট অপারেশন এবং মূল পৃষ্ঠায় পোস্ট করা মানগুলি ব্যবহার করে আমি মূল পৃষ্ঠাটি রিফ্রেশ করছি hing
জেপ্রো

8
জেপ্রো: একটি ডাটাবেস আপডেট করা আপনার ব্যবহারকারীর সঠিক কারণ কমবেশি POST। POST ব্যবহার সম্পর্কে কিছুই আপনাকে সবেমাত্র পোস্ট করা ক্ষেত্রগুলির সাথে একই ফর্মটি পপ করা থেকে বিরত রাখে না, তাই আপনি এর দ্বারা কী বোঝাতে চাই তা নিশ্চিত নই।
জন Feminella

1
@ জেপ্রো: সেক্ষেত্রে সাধারণ কৌশলটি একই পৃষ্ঠায় পোস্ট করা। পৃষ্ঠার হ্যান্ডলার (যা GET এবং POST উভয়ের জন্য একই কোড হতে পারে) পোষ্ট প্যারামিটারগুলির জন্য প্রথম চেক করে, যদি এটি খুঁজে পায় তবে তাদের পরিচালনা করে, তারপরে পৃষ্ঠাটি যথাযথ মানগুলিতে পূরণ করে, যা হয় আপডেট হওয়া মানগুলি ( যদি পোস্ট এবং আপডেট সফল হয়) বা মূল মানগুলি (যদি জিইটি হয়, বা পোষ্ট এবং আপডেট ব্যর্থ হয়)। আপডেট ব্যর্থ হলে, আপনার ব্যর্থতা বর্ণনা করে এমন প্রতি ফিল্ড ত্রুটি বার্তা থাকতে পারে।
মাইক ডিসিমোন

5
আমি এটি বেশ দেরিতে বুঝতে পেরেছি, তাই আমি এটি ভাগ করে নিতে চাই। শব্দটি LimitRequestLineযদি আপনার httpd.conf ফাইলে কোথাও না খুঁজে পান তবে আপনি নিজের পছন্দ মতো লাইনটি নিজেই যুক্ত করুন। উদাহরণস্বরূপ:LimitRequestLine 100000
জুলস কল

উত্তর এবং ব্যাখ্যা জন্য ধন্যবাদ, আপনি আমার দিন সংরক্ষণ। :)
মেঘ সাগীর

16

জন এর উত্তরের ভিত্তিতে, আমি জিইটি অনুরোধটিকে একটি পোস্টের অনুরোধে পরিবর্তন করেছি। এটি সার্ভার কনফিগারেশন পরিবর্তন না করেই কাজ করে। সুতরাং আমি কিভাবে এটি বাস্তবায়ন করতে খুঁজছেন গিয়েছিলাম। নিম্নলিখিত পৃষ্ঠাগুলি সহায়ক ছিল:

পিএইচপি সহ jQuery আজাক্স পোস্টের উদাহরণ (স্যানিটাইজ পোস্ট ডেটা মন্তব্যটি নোট করুন) এবং

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

মূলত, পার্থক্যটি হ'ল জিইটি অনুরোধটির url এবং প্যারামিটারগুলি একটি স্ট্রিংয়ে থাকে এবং তারপরে নালটি প্রেরণ করে:

http.open("GET", url+"?"+params, true);
http.send(null);

যদিও পোষ্ট অনুরোধটি ইউআরএল এবং পরামিতিগুলিকে পৃথক কমান্ডে প্রেরণ করে:

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

আমার একটি সাধারণ কাজ আছে।

মনে করুন আপনার ইউআরআইয়ের একটি স্ট্রিং রয়েছে stringdataযা খুব দীর্ঘ। আপনার সার্ভারের সীমাবদ্ধতার উপর নির্ভর করে আপনি কেবল এটি বেশ কয়েকটি অংশে বিভক্ত করতে পারেন। তারপরে প্রথম ফাইলটি জমা দিন, আমার ক্ষেত্রে একটি ফাইল লিখুন। তারপরে আগের যুক্ত ডেটা যুক্ত করতে পরবর্তীগুলিকে জমা দিন।


আপনি একটি উদাহরণ প্রদান করতে পারেন? আমি দেখতে পাচ্ছি যে যখন ব্যবহারকারীটি উত্পাদিত হয় তখন আপনি কীভাবে স্ট্রিংটিকে বিভক্ত করেন ...
এন্ডিওরিফ

4
খুব সস্তা workaround। ডোমেন সমস্যার পুনর্বিবেচনা করা ভাল!
মুহাম্মদ হেউডি

13
এটি এতগুলি ডাউনওয়েট পাওয়ার যোগ্য নয়। অবশ্যই এমন পরিস্থিতি রয়েছে যেখানে একাধিক অনুরোধ জমা দেওয়া একটি গ্রহণযোগ্য কাজ হতে পারে। সত্য, উত্তরের মানটি কিছুটা কম, তবে এটি এমন একজন ব্যবহারকারীের কাছ থেকে প্রত্যাশিত, যিনি এসও-তে একেবারেই নতুন। আসুন কিছু নতুন প্রেম দেখান এবং প্রতিক্রিয়া অফার করি কেবলমাত্র নতুনদেরকে নিম্নমানের পরিবর্তে যারা "এসও" পান না!
রিনোগো

1
আমি সম্মতি
ফিলিপ ভাল্ডেস

3

JQuery থেকে get .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

থেকে একটি উদ্ধৃতাংশ হাইপারটেক্সট ট্রান্সফার প্রোটোকল - HTTP- র / 1.1: জন্য RFC 2616 :

পোস্ট পদ্ধতি অনুরোধ করতে ব্যবহৃত হয় যে মূল সার্ভার সত্তা সংস্থান অনুরোধ-লাইন অনুরোধ-কোনো URI দ্বারা চিহ্নিত একটি নতুন অধীনস্থ যেমন অনুরোধে ঘিরা গ্রহণ। পোষ্টটি একটি অভিন্ন পদ্ধতি নিম্নলিখিত ফাংশনগুলি আবরণ করার জন্য ডিজাইন করা হয়েছে:

  • বিদ্যমান সংস্থানসমূহ টিকা;
  • বুলেটিন বোর্ড, নিউজ গ্রুপ, মেলিং তালিকা বা অনুরূপ গ্রুপের নিবন্ধগুলিতে বার্তা পোস্ট করা;
  • ডেটা হ্যান্ডলিং প্রক্রিয়াতে কোনও ফর্ম জমা দেওয়ার ফলাফলের মতো ডেটাগুলির একটি ব্লক সরবরাহ করা ;
  • অ্যাপেন্ড অপারেশনের মাধ্যমে একটি ডাটাবেস প্রসারিত করা।

8
দেখছেন না কিভাবে এই প্রশ্নের উত্তর দেয় ..?
আফার

মূল পোস্টারটি জানিয়েছে যে রেকর্ডগুলি আপডেট করা হচ্ছে। আপডেটগুলির জন্য, পোষ্ট বা পুট ব্যবহার করা ভাল, অনুগ্রহ করে জিইটি নয়। তবে অবশ্যই এটি হতে পারে যে আপডেট করার আগে প্রদর্শিত রেকর্ডগুলি পুনরুদ্ধার করার সময় ইউআরএল সর্বাধিক সীমা অতিক্রম করে এবং তারপরে জিইটি পদ্ধতিটি উপযুক্ত তবে এটি এই সীমাবদ্ধতার কারণে ব্যর্থ হতে পারে। মূল পোস্টারটিতে সমস্যাটি কোন পর্যায়ে উত্থাপিত হয়েছে তা উল্লেখ করেনি, সুতরাং এটি ধরে নেওয়া যেতে পারে যে এটি আপডেটের সময়েই হয়েছিল, তবে আমরা নিশ্চিত হতে পারি না ...
জাস্টামার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.