Bir PHP web uygulaması geliştirdim. Kullanıcıya tek seferde birden fazla sorunu güncelleme seçeneği veriyorum. Bunu yaparken bazen kullanıcı bu hatayla karşılaşıyor. Apache'de URL'nin uzunluğunu artırmanın bir yolu var mı?
Bir PHP web uygulaması geliştirdim. Kullanıcıya tek seferde birden fazla sorunu güncelleme seçeneği veriyorum. Bunu yaparken bazen kullanıcı bu hatayla karşılaşıyor. Apache'de URL'nin uzunluğunu artırmanın bir yolu var mı?
Yanıtlar:
Apache altında sınır, yapılandırılabilir bir değerdir LimitRequestLine
. Daha uzun bir istek URI'sini desteklemek istiyorsanız, bu değeri varsayılan 8190 değerinden daha büyük bir değere değiştirin. Değer /etc/apache2/apache2.conf içindedir . Değilse, LimitRequestLine 10000
altına yeni bir satır ( ) ekleyin AccessFileName .htaccess
.
Ancak, aslında bu sınırla karşılaşıyorsanız, muhtemelen kötüye GET
kullanıyorsunuzdur. POST
Bu tür verileri iletmek için kullanmalısınız - özellikle değerleri güncellemek için kullandığınızı bile kabul ettiğiniz için. Yukarıdaki bağlantıyı kontrol ederseniz, Apache'nin "Normal koşullar altında, değer varsayılandan değiştirilmemelidir" dediğini bile fark edeceksiniz.
POST
. POST'u kullanmakla ilgili hiçbir şey, aynı formu yeni gönderilmiş alanlarla doldurmanızı engellemez, bu yüzden bununla ne demek istediğinizden emin değilim.
LimitRequestLine
httpd.conf dosyanızın hiçbir yerinde bulamazsanız, satırı istediğiniz yere kendiniz eklemeniz yeterlidir. Örneğin:LimitRequestLine 100000
John'un cevabına göre GET isteğini POST isteği olarak değiştirdim. Sunucu yapılandırmasını değiştirmek zorunda kalmadan çalışır. Ben de bunun nasıl uygulanacağına bakmaya gittim. Aşağıdaki sayfalar yardımcı oldu:
PHP ile jQuery Ajax POST örneği (Yayınlanan verileri temizleme açıklamasına dikkat edin) ve
http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Temel olarak, fark, GET isteğinin url ve parametrelere bir dizede sahip olması ve ardından null göndermesidir:
http.open("GET", url+"?"+params, true);
http.send(null);
POST isteği url'yi ve parametreleri ayrı komutlarda gönderirken:
http.open("POST", url, true);
http.send(params);
İşte çalışan bir örnek:
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'den fazla karakteri sorunsuz bir şekilde gönderdim.
Basit bir çözümüm var.
URI'nizin stringdata
çok uzun bir dizeye sahip olduğunu varsayalım . Sunucunuzun sınırlarına bağlı olarak onu basitçe birkaç parçaya ayırabilirsiniz. Sonra benim durumumda bir dosya yazmak için ilkini gönderin. Ardından, daha önce eklenen verilere eklemek için sonrakileri gönderin.
JQuery'den $ .getJSON () kullandıktan sonra bu hatayı aldım. Göndermek için yeni değiştirdim:
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!");
});
RFC 2616'dan bir alıntı : Köprü Metni Aktarım Protokolü - HTTP / 1.1 :
POST yöntemi kökenli sunucu İsteği-Line Request-URI tarafından tanımlanan kaynağın yeni bir ikincil parçası olarak isteğe eklenmiş varlığa kabul etmesini talep etmek için kullanılır. POST, tek tip bir yöntemin aşağıdaki işlevleri kapsamasına izin verecek şekilde tasarlanmıştır:
- Mevcut kaynakların ek açıklaması;
- Bir ilan tahtasına, haber grubuna, posta listesine veya benzer bir makale grubuna mesaj göndermek;
- Bir veri işleme sürecine bir form göndermenin sonucu gibi bir veri bloğu sağlamak ;
- Ekleme işlemiyle bir veritabanını genişletme.