2010-05-23 27 views
74

Tôi đã phát triển một ứng dụng web PHP. Tôi đang đưa ra một tùy chọn để người dùng cập nhật nhiều vấn đề trên một lần. Khi làm như vậy, đôi khi người dùng gặp phải lỗi này. Có cách nào để tăng chiều dài của URL trong apache?Làm cách nào để giải quyết lỗi HTTP U14 "Yêu cầu URI quá dài"?

+0

Nếu bạn gặp lỗi này trên máy chủ Windows và/hoặc trong ứng dụng IIS/ASP.NET, hãy xem câu hỏi: http://stackoverflow.com/q/23237538/ 12484 –

Trả lời

126

Dưới Apache, giới hạn là giá trị có thể định cấu hình, LimitRequestLine. Thay đổi giá trị này thành giá trị lớn hơn giá trị mặc định là 8190 nếu bạn muốn hỗ trợ URI yêu cầu dài hơn. Giá trị nằm ở /etc/apache2/apache2.conf. Nếu không, hãy thêm một dòng mới (LimitRequestLine 10000) theo AccessFileName .htaccess.

Tuy nhiên, lưu ý rằng nếu bạn đang thực sự chạy vào giới hạn này, có thể bạn đang lạm dụng GET để bắt đầu. Bạn nên sử dụng POST để truyền loại dữ liệu này - đặc biệt vì bạn thậm chí thừa nhận rằng bạn đang sử dụng dữ liệu đó để cập nhật giá trị. Nếu bạn kiểm tra liên kết ở trên, bạn sẽ nhận thấy rằng Apache thậm chí còn nói "Trong điều kiện bình thường, giá trị không nên thay đổi từ mặc định."

+0

Tôi đã thử sử dụng POST lúc đầu, nhưng đây là một hoạt động cập nhật trên cơ sở dữ liệu, và tôi đang làm mới trang gốc bằng cách sử dụng các giá trị ban đầu được đăng lên trang đó. – JPro

+6

JPro: Việc cập nhật cơ sở dữ liệu ít nhiều là lý do chính xác bạn sẽ sử dụng 'POST'. Không có gì về việc sử dụng POST ngăn cản bạn điền vào cùng một biểu mẫu với các trường vừa được đăng, vì vậy tôi không chắc chắn ý của bạn là gì. –

+0

@JPro: Kỹ thuật thông thường trong trường hợp đó là POST tới cùng một trang. Trình xử lý cho trang (có thể là mã giống nhau cho cả GET và POST) trước tiên kiểm tra các tham số POST, xử lý chúng nếu nó tìm thấy chúng, sau đó trả về trang với các giá trị thích hợp được điền vào, sẽ là giá trị cập nhật (nếu POST và bản cập nhật thành công) hoặc các giá trị ban đầu (nếu GET, hoặc nếu POST và bản cập nhật không thành công). Nếu bản cập nhật không thành công, bạn thậm chí có thể có thông báo lỗi cho mỗi trường mô tả lỗi. –

0

Một đoạn trích từ RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1

Các POST phương pháp được sử dụng để yêu cầu các máy chủ gốc chấp nhận thực thể khép kín trong yêu cầu như một cấp dưới mới của tài nguyên xác định bởi các yêu cầu-URI trong Dòng yêu cầu. POST được thiết kế để cho phép phương pháp thống nhất bao gồm các chức năng sau:

  • Chú thích tài nguyên hiện có;
  • Đăng thông báo lên bảng thông báo, nhóm tin tức, danh sách gửi thư, hoặc nhóm bài viết tương tự;
  • Cung cấp khối dữ liệu, chẳng hạn như kết quả gửi biểu mẫu , đến quy trình xử lý dữ liệu;
  • Mở rộng cơ sở dữ liệu thông qua thao tác chắp thêm.
+4

Không thấy cách này trả lời câu hỏi ..? – default

-4

Tôi có cách giải quyết đơn giản.

Giả sử URI của bạn có chuỗi stringdata quá dài. Bạn có thể chỉ cần chia nhỏ nó thành một số phần phụ thuộc vào giới hạn của máy chủ của bạn. Sau đó gửi bản đầu tiên, trong trường hợp của tôi để viết một tập tin. Sau đó gửi các tệp tiếp theo để thêm vào dữ liệu đã thêm trước đó.

+0

Bạn có thể cung cấp một ví dụ không? Tôi có thể xem cách bạn tách chuỗi khi người dùng tạo ... – endyourif

+1

Giải pháp rất rẻ. Tốt hơn là xem xét lại vấn đề miền! –

+7

Điều này không xứng đáng để có quá nhiều downvotes. Chắc chắn có những tình huống trong đó việc gửi nhiều yêu cầu có thể là giải pháp có thể chấp nhận được. Đúng, chất lượng của câu trả lời là một chút thấp, nhưng đó là để được mong đợi từ một người dùng là thương hiệu mới để SO. Hãy cho thấy một số tình yêu và cung cấp thông tin phản hồi thay vì chỉ downvoting người mới đến mà không "có được" SO chưa! – rinogo

10

Dựa trên câu trả lời của John, tôi đã thay đổi yêu cầu GET thành yêu cầu POST. Nó hoạt động, mà không cần phải thay đổi cấu hình máy chủ. Vì vậy, tôi đã đi tìm cách để thực hiện điều này.Các trang sau đều hữu ích:

jQuery Ajax POST example with PHP (Lưu ý Sanitize gửi dữ liệu nhận xét) và

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

Về cơ bản, sự khác biệt là các yêu cầu GET có url và các thông số trong một chuỗi và sau đó gửi null:

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

trong khi yêu cầu POST gửi url và các thông số trong lệnh riêng biệt:

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

Dưới đây là một ví dụ làm việc:

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

?> 

tôi chỉ gửi qua 12.000 ký tự mà không cần bất kỳ vấn đề.

1

Tôi gặp lỗi này sau khi sử dụng $ .getJSON() từ JQuery. Tôi vừa thay đổi thành bài đăng:

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!"); 
    }); 
+1

đây có phải là câu trả lời hoặc câu hỏi không? – Takarii

+0

Đây là cách khắc phục nhanh chóng. Thay đổi từ nhận bài đăng cho phép URL dài mà không có bất kỳ thay đổi cấu hình máy chủ nào. – mt025

Các vấn đề liên quan