PHP Web アプリを開発しました。一度に複数の問題を更新するオプションをユーザーに提供しています。その際、ユーザーがこのエラーに遭遇することがあります。Apache で URL の長さを増やす方法はありますか?
5 に答える
Apacheでは、制限は構成可能な値ですLimitRequestLine
。より長いリクエストURIをサポートする場合は、この値をデフォルトの8190よりも大きい値に変更してください。値は/etc/apache2/apache2.confにあります。LimitRequestLine 10000
そうでない場合は、の下に新しい行()を追加しAccessFileName .htaccess
ます。
ただし、実際にこの制限に達した場合は、GET
そもそも悪用している可能性があることに注意してください。この種のデータを送信するために使用する必要がありPOST
ます。特に、値を更新するために使用していることを認めているためです。上記のリンクを確認すると、Apacheが「通常の状態では、値をデフォルトから変更しないでください」とさえ言っていることに気付くでしょう。
ジョンの回答に基づいて、GET リクエストを POST リクエストに変更しました。サーバー構成を変更しなくても機能します。そこで、これを実装する方法を調べました。以下のページが役に立ちました。
PHP を使用した jQuery Ajax POST の例 (投稿されたデータのサニタイズに関するコメントに注意してください) および
http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
基本的に、違いは、GET リクエストが URL とパラメータを 1 つの文字列に含み、その後 null を送信することです。
http.open("GET", url+"?"+params, true);
http.send(null);
一方、POST リクエストは URL とパラメータを別々のコマンドで送信します。
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 文字以上を問題なく送信しました。
簡単な回避策があります。
URI の文字列stringdata
が長すぎるとします。サーバーの制限に応じて、いくつかの部分に単純に分割できます。次に、最初のファイルを送信します。私の場合は、ファイルを書き込みます。次に、次のものを送信して、以前に追加されたデータに追加します。
RFC 2616からの抜粋: Hypertext Transfer Protocol -- HTTP/1.1 :
POSTメソッドは、オリジン サーバーがリクエストに含まれるエンティティを、Request-Line の Request-URI で識別されるリソースの新しい従属として受け入れるように要求するために使用されます。POST は、統一されたメソッドで次の機能をカバーできるように設計されています。
- 既存のリソースの注釈。
- 掲示板、ニュースグループ、メーリング リスト、または同様の記事グループにメッセージを投稿する。
- フォーム送信の結果など、データのブロックをデータ処理プロセスに提供する。
- 追加操作によるデータベースの拡張。