Ошибка 413 при отправке большой строки POST

Я пытаюсь загрузить изображения с помощью API FileReader, и запись URL-адреса данных из метода FileReader.readAsDataURL() в файл с использованием PHP на стороне сервера.

Метод работает с изображениями меньшего размера (точно не знаю, насколько они маленькие, но ‹1 МБ, вероятно, достаточно точный). Однако при загрузке изображений большего размера я получаю ошибку 413 Request Entity Too Large. Я видел этот вопрос и попробовал оба решения , однако первый ничего не сделал, а второй выдал ошибку 500. Когда я проверил журнал ошибок, он сказал:

 /home/username/public_html/.htaccess: LimitRequestFieldsize not allowed here

Почему это не работает?

php.ini

file_uploads = On
post_max_size = 50M
upload_max_filesize = 50M

.htaccess

RewriteEngine On 

# LimitRequestFieldSize 2097152

SSLRenegBufferSize 1000000

JS

function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();

    reader.onload = function(e) {

      $.ajax({
        url: "?action=saveImg",
        type: "POST",
        dataType: "json",
        data: {
          image: e.target.result,
          id: id
        },
        success: function(data){
          $.dialog(data.message, data.title);
        }
      });
    }
    for(var i = 0; i < input.files.length; i++){
      reader.readAsDataURL(input.files[i]);
    }
  }
}

$("#file").change(function() {
  readURL(this);
});

PHP

$id = $_POST["id"];

$filetype = str_replace('data:', '', explode(";", $_POST["image"])[0]);

$data = $_POST["image"];

list($type, $data) = explode(';', $data);
list(, $data)      = explode(',', $data);
$data = base64_decode($data);

$rand = random_str(6);

$ext = explode("/", $filetype)[1];

if(!is_dir("../../images/product/{$id}/")){
  mkdir("../../images/product/{$id}/");
}

$fh = fopen("../../images/product/{$id}/{$rand}.{$ext}", "w+");
fwrite($fh, $data);
fclose($fh);

$return = ["message" => "ID is $id. Saved image as /images/product/{$id}/{$rand}.{$ext}.", "title" => "Saved Image", "image" => "/images/product/{$id}/{$rand}.{$ext}"];
echo json_encode($return);

die();

Как я могу заставить это работать?


person Yaakov Ainspan    schedule 09.01.2018    source источник
comment
Вы уверены, что читаете правильную строку с ошибкой?   -  person revo    schedule 09.01.2018
comment
Достаточно уверен. Что еще это может быть?   -  person Yaakov Ainspan    schedule 09.01.2018
comment
Интересно, имеет ли директива LimitRequestFieldsize какое-либо отношение к ошибке 413 Request Entity Too Large.   -  person revo    schedule 09.01.2018
comment
... и, очевидно, он регистрируется, поскольку вы использовали директиву непосредственно внутри файла .htaccess, чего вам не следует.   -  person revo    schedule 09.01.2018
comment
В ответе, который я увидел, казалось, что LimitRequestFieldsize нужно было чем-то заняться, и где еще я должен был использовать эту директиву? Я нахожусь на общем сервере godaddy.   -  person Yaakov Ainspan    schedule 09.01.2018
comment
Возможный дубликат Как изменить limitrequestfieldsize в Apache 2.4. 2   -  person Tony Chiboucas    schedule 09.01.2018
comment
Вы уверены, что ваш файл php.ini прочитан?   -  person revo    schedule 09.01.2018
comment
Совершенно уверен. Я заглянул на справочный сайт godaddy, и они сказал, что при запуске нового сеанса будет прочитан файл php.ini.   -  person Yaakov Ainspan    schedule 09.01.2018
comment
Ну, не публикуйте его как URL-адрес base64 ... он примерно в 3 раза больше! используйте FormData!   -  person Endless    schedule 10.01.2018


Ответы (1)


Это проблема конфигурации apache

Помимо LimitRequestFieldsize, существует множество потенциальных причин этой проблемы.

LimitRequestFieldsize

Во-первых, LimitRequestFieldsize обычно должен быть установлен в .conf файле, а не в .htaccess. Кроме того, увеличение лимита влечет за собой серьезные проблемы с безопасностью. (медленная атака лори на одного)

SecRequestBodyLimit (если вы используете mod_security)

Также должен быть установлен в .conf файле. Также имеет значение для безопасности.

SecRequestBodyLimit 10485760

Ваш вопрос относится к ServerFault

person Tony Chiboucas    schedule 09.01.2018