Desenvolvi um aplicativo da web em PHP. Estou dando uma opção para o usuário atualizar vários problemas de uma vez. Ao fazer isso, às vezes o usuário encontra esse erro. Existe alguma maneira de aumentar o comprimento da URL no apache?
Desenvolvi um aplicativo da web em PHP. Estou dando uma opção para o usuário atualizar vários problemas de uma vez. Ao fazer isso, às vezes o usuário encontra esse erro. Existe alguma maneira de aumentar o comprimento da URL no apache?
Respostas:
No Apache, o limite é um valor configurável LimitRequestLine
,. Altere esse valor para algo maior do que seu padrão de 8190 se quiser oferecer suporte a um URI de solicitação mais longo. O valor está em /etc/apache2/apache2.conf . Caso contrário, adicione uma nova linha ( LimitRequestLine 10000
) em AccessFileName .htaccess
.
No entanto, observe que, se você está realmente chegando a esse limite, provavelmente está abusando GET
. Você deve usar POST
para transmitir esse tipo de dados - especialmente porque você até admite que está usando para atualizar valores. Se você verificar o link acima, notará que o Apache até diz "Em condições normais, o valor padrão não deve ser alterado."
POST
. Nada sobre o uso de POST impede que você preencha o mesmo formulário com os campos que acabaram de ser postados, então não tenho certeza do que você quer dizer com isso.
LimitRequestLine
em nenhum lugar do arquivo httpd.conf, basta adicionar a linha em qualquer lugar que desejar. Por exemplo:LimitRequestLine 100000
Com base na resposta de John, alterei a solicitação GET para uma solicitação POST. Funciona, sem ter que alterar a configuração do servidor. Então, procurei como implementar isso. As seguintes páginas foram úteis:
Exemplo de jQuery Ajax POST com PHP (observe a observação de dados postados sanitize) e
http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Basicamente, a diferença é que a solicitação GET tem o url e os parâmetros em uma string e envia um valor nulo:
http.open("GET", url+"?"+params, true);
http.send(null);
enquanto a solicitação POST envia o url e os parâmetros em comandos separados:
http.open("POST", url, true);
http.send(params);
Aqui está um exemplo prático:
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>';
?>
Acabei de enviar mais de 12.000 caracteres sem problemas.
Eu tenho uma solução alternativa simples.
Suponha que seu URI tenha uma string stringdata
muito longa. Você pode simplesmente dividi-lo em várias partes, dependendo dos limites do seu servidor. Em seguida, envie o primeiro, no meu caso, para escrever um arquivo. Em seguida, envie os próximos para anexar aos dados adicionados anteriormente.
Recebi este erro depois de usar $ .getJSON () do JQuery. Acabei de mudar para postar:
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!");
});
Um trecho do RFC 2616: Hypertext Transfer Protocol - HTTP / 1.1 :
O método POST é usado para solicitar que o servidor de origem aceite a entidade incluída na solicitação como um novo subordinado do recurso identificado pelo Request-URI na Request-Line. O POST é projetado para permitir um método uniforme para cobrir as seguintes funções:
- Anotação de recursos existentes;
- Publicar uma mensagem em um quadro de avisos, grupo de notícias, lista de e-mails ou grupo semelhante de artigos;
- Fornecer um bloco de dados, como o resultado do envio de um formulário, a um processo de tratamento de dados ;
- Estendendo um banco de dados por meio de uma operação de acréscimo.