& quot; _ _ Token ‘не найден в данных запроса & quot; с CakePHP3 на производственном сервере

У меня есть веб-сайт, созданный с помощью CakePHP 3.6, который, кажется, отлично работает на моем компьютере (с использованием WAMP, PHP 5.6.31, Apache 2.4.27), но при работе на рабочем сервере ведет себя по-другому (Ubuntu 14.04, PHP 5.6.37, Apache 2.4.7).

Существует один запрос POST, который генерирует следующую ошибку ТОЛЬКО на рабочем сервере:

'_Token' was not found in request data.

Cake\Controller\Exception\AuthSecurityException

У меня включен компонент безопасности, и я не хочу его отключать. Все поля формы создаются с помощью FormHelper. Поля не модифицируются с помощью Javascript.

Ошибка не всегда происходит и в основном зависит от содержимого, которое вводится в формах пользователем. Я не мог определить, какой контент будет генерировать эту ошибку. Отправленные данные представляют собой группу строк, которые могут содержать что-либо. Но я не вижу, как содержание имеет отношение к этой ошибке.

Вот пример кода, который генерирует форму

<?php

echo '<div class="custom-card">';
echo $this->Form->create($keyword);
echo '<table class="table table-striped table-bordered">';

// Create Table Headers with languages name
$tableHeaders = ["Mot clé"];
for ($i = 0; $i < count($languagesEnabled); $i++)
{
array_push($tableHeaders, "{$languagesEnabled[$i]->name} (version {$languagesEnabled[$i]->version})");
}
array_push($tableHeaders, "");
echo '<thead>';
echo $this->Html->tableHeaders($tableHeaders);
echo '</thead>';

//Fill Table Cells with keywords and sentences
for ($i = 0; $i < count($keywords); $i++)
{
$keywordName = $this->Form->text("keywords.$i.name", ["value" => $keywords[$i]->name, 'class' => 'form-control']);
$keywordId = $this->Form->hidden("keywords.$i.id", ["value" => $keywords[$i]->id]);

$tableCells = [$keywordName . " " . $keywordId];
$tableCells = array_pad($tableCells, count($languages) - 1, "");
for ($j = 0; $j < count($languagesEnabled); $j++)
{
$sentenceLanguageId = $this->Form->hidden("keywords.$i.sentences.$j.language_id", ["value" => $languagesEnabled[$j]->id]);
$sentenceKeywordId = $this->Form->hidden("keywords.$i.sentences.$j.keyword_id", ["value" => $keywords[$i]->id]);
$sentenceArray = ["value" => findSentenceValueInArray($keywords[$i]->sentences, $languagesEnabled[$j]->id)];
$sentenceValue = $this->Form->textarea("keywords.$i.sentences.$j.sentence", [
'value' => $sentenceArray,
'class' => 'form-control',
'id' => "area-$i-$j",
'onfocus' => "autosize(document.getElementById('area-$i-$j'))"]);
$tableCells[$j + 1] = $sentenceValue . $sentenceLanguageId . $sentenceKeywordId;
}
$tableCells[count($languagesEnabled) + 1] = $this->Html->link('Supprimer',
['controller' => 'Keywords', 'action' => 'remove', $keywords[$i]->id],
['confirm' => 'Êtes vous sûr de vouloir supprimer la phrase ?']);
echo $this->Html->tableCells($tableCells);
}
echo "</table>";
echo $this->Form->submit('Valider', ['class'=>'btn btn-primary']);
echo $this->Form->end();
echo '</div>';
?>

1

Решение

Благодаря Greg Я смог найти, в чем проблема. По его словам, если вы отправите слишком много данных, они могут быть усечены.

Для диагностики проблемы я фактически отобразил данные, полученные SecurityComponent. Вы можете получить к нему доступ в vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php, В этом файле есть функция _validToken(Controller $controller), Отображение содержания $check переменная может помочь (я использовал pr() функция для этого).

Я заметил, что некоторые данные, которые я отправил, на самом деле отсутствовали. И, очевидно, как заявляет CakePHP, _Token также отсутствовал.

Единственное, что мне нужно было сделать, это увеличить max_input_vars в моем php.ini

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]