Bagaimana cara mengatasi error HTTP 414 "Request URI too long"?

103

Saya telah mengembangkan aplikasi web PHP. Saya memberikan opsi kepada pengguna untuk memperbarui beberapa masalah sekaligus. Saat melakukannya, terkadang pengguna mengalami kesalahan ini. Apakah ada cara untuk meningkatkan panjang URL di apache?

JPro
sumber
Jika Anda melihat kesalahan ini di server Windows dan / atau di aplikasi IIS / ASP.NET, lihat pertanyaan: stackoverflow.com/q/23237538/12484
Jon Schneider

Jawaban:

166

Di bawah Apache, batasnya adalah nilai yang dapat dikonfigurasi LimitRequestLine,. Ubah nilai ini menjadi nilai yang lebih besar dari defaultnya 8190 jika Anda ingin mendukung URI permintaan yang lebih panjang. Nilainya ada di /etc/apache2/apache2.conf . Jika tidak, tambahkan baris baru ( LimitRequestLine 10000) di bawahAccessFileName .htaccess .

Namun, perhatikan bahwa jika Anda benar-benar mencapai batas ini, Anda mungkin menyalahgunakannya sejak GETawal. Anda harus menggunakan POSTuntuk mengirimkan data semacam ini - terutama karena Anda bahkan mengakui bahwa Anda menggunakannya untuk memperbarui nilai. Jika Anda memeriksa tautan di atas, Anda akan melihat bahwa Apache bahkan mengatakan "Dalam kondisi normal, nilainya tidak boleh diubah dari default."

John Feminella
sumber
Saya mencoba menggunakan POST pada awalnya, tetapi ini adalah operasi pembaruan pada database, dan saya menyegarkan halaman asli menggunakan nilai-nilai yang semula diposting ke halaman itu.
JPro
8
JPro: Memperbarui database kurang lebih merupakan alasan pasti yang Anda gunakan POST. Tidak ada tentang penggunaan POST yang menghalangi Anda untuk mengisi formulir yang sama dengan bidang yang baru saja diposting, jadi saya tidak yakin apa yang Anda maksud dengan itu.
John Feminella
1
@JPro: Teknik biasa dalam hal ini adalah POST ke halaman yang sama. Penangan untuk halaman (yang bisa berupa kode yang sama untuk GET dan POST) pertama-tama memeriksa parameter POST, menanganinya jika menemukannya, lalu mengembalikan halaman dengan nilai yang benar sudah diisi, yang akan berupa nilai yang diperbarui ( jika POST dan pembaruan berhasil) atau nilai asli (jika GET, atau jika POST dan pembaruan gagal). Jika pembaruan gagal, Anda bahkan dapat memiliki pesan kesalahan per bidang yang menjelaskan kegagalan tersebut.
Mike DeSimone
5
Saya menemukan ini cukup terlambat, jadi saya ingin membagikannya. Jika Anda tidak dapat menemukan kata tersebut LimitRequestLinedi mana pun di file httpd.conf Anda, cukup tambahkan barisnya sendiri di mana pun Anda suka. Misalnya:LimitRequestLine 100000
Jules Colle
terima kasih atas jawaban dan penjelasannya, Anda menyelamatkan hari saya. :)
may saghira
16

Berdasarkan jawaban John, saya mengubah permintaan GET menjadi permintaan POST. Ini berfungsi, tanpa harus mengubah konfigurasi server. Jadi saya pergi mencari cara menerapkan ini. Halaman-halaman berikut sangat membantu:

Contoh jQuery Ajax POST dengan PHP (Perhatikan komentar sanitize diposting data) dan

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

Pada dasarnya, perbedaannya adalah bahwa permintaan GET memiliki url dan parameter dalam satu string dan kemudian mengirimkan null:

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

sedangkan permintaan POST mengirimkan url dan parameter dalam perintah terpisah:

http.open("POST", url, true);
http.send(params);

Berikut adalah contoh yang berfungsi:

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>';

?>

Saya baru saja mengirim lebih dari 12.000 karakter tanpa masalah.

atmelino
sumber
4

Saya memiliki solusi sederhana.

Misalkan URI Anda memiliki string stringdatayang terlalu panjang. Anda cukup memecahnya menjadi beberapa bagian tergantung pada batas server Anda. Kemudian kirimkan yang pertama, dalam kasus saya untuk menulis file. Kemudian kirimkan yang berikutnya untuk ditambahkan ke data yang ditambahkan sebelumnya.

Shrey Gupta
sumber
Bisakah Anda memberikan contoh? Saya dapat melihat bagaimana Anda membagi string saat dibuat oleh pengguna ...
endyourif
4
Solusi yang sangat murah. Lebih baik pertimbangkan kembali masalah domain!
Muhammad Hewedy
13
Ini tidak pantas untuk mendapatkan begitu banyak suara negatif. Tentu ada situasi di mana mengirimkan beberapa permintaan dapat menjadi solusi yang dapat diterima. Benar, kualitas jawabannya agak rendah, tetapi itulah yang diharapkan dari pengguna yang baru mengenal SO. Mari tunjukkan cinta dan berikan umpan balik alih-alih hanya merendahkan pendatang baru yang belum "paham"!
rinogo
1
Saya setuju, ini terlihat layak
Felipe Valdes
3

Saya mendapat kesalahan ini setelah menggunakan $ .getJSON () dari JQuery. Saya baru saja mengubah postingan:

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!");
    });
Software Fusca
sumber
2
apakah ini jawaban atau pertanyaan?
Takarii
Ini adalah perbaikan cepat yang bagus. Mengubah dari dapatkan ke posting memungkinkan URL panjang tanpa perubahan konfigurasi server apa pun.
mt025
1

Kutipan dari RFC 2616: Hypertext Transfer Protocol - HTTP / 1.1 :

The POST metode yang digunakan untuk permintaan bahwa server asal menerima entitas tertutup di permintaan sebagai subordinat baru dari sumber daya diidentifikasi oleh Request-URI dalam Permintaan-Line. POST dirancang untuk memungkinkan metode seragam untuk mencakup fungsi-fungsi berikut:

  • Anotasi sumber daya yang ada;
  • Memposting pesan ke papan buletin, grup berita, milis, atau grup artikel serupa;
  • Memberikan sekumpulan data, seperti hasil pengiriman formulir, ke proses penanganan data ;
  • Memperluas database melalui operasi penambahan.
Akal Sehat Anda
sumber
8
Tidak melihat bagaimana ini menjawab pertanyaan ..?
Afr
Poster asli mengatakan bahwa catatan sedang diperbarui. Untuk update, sebaiknya gunakan POST atau PUT dan bukan GET. Namun, tentu saja, mungkin saja batas maks. URL terlampaui saat mengambil record untuk ditampilkan sebelum memperbarui, dan kemudian metode GET sesuai, tetapi bisa gagal karena batas ini. Poster asli tidak menyebutkan pada tahap mana masalah tersebut muncul, sehingga dapat diasumsikan bahwa itu terjadi selama pembaruan itu sendiri, tetapi kami tidak dapat memastikan ...
JustAMartin