在生产服务器上使用 CakePHP3 时“在请求数据中找不到‘_Token’”
"'_Token' was not found in request data" with CakePHP3 on production server
我有一个用 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>';
?>
感谢 Greg 我能够找到问题所在。正如他所说,如果您发送的数据过多,它可能会被截断。
为了诊断问题,我实际显示了 SecurityComponent 接收到的数据。您可以在 vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php
中访问它。在这个文件中有一个函数 _validToken(Controller $controller)
。显示 $check
变量的内容可能会有帮助(为此我使用了 pr()
函数)。
我注意到我发送的一些数据实际上丢失了。显然,正如 CakePHP 所述,_Token 也丢失了。
我唯一要做的就是在 php.ini
中增加 max_input_vars
我有一个用 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>';
?>
感谢 Greg 我能够找到问题所在。正如他所说,如果您发送的数据过多,它可能会被截断。
为了诊断问题,我实际显示了 SecurityComponent 接收到的数据。您可以在 vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php
中访问它。在这个文件中有一个函数 _validToken(Controller $controller)
。显示 $check
变量的内容可能会有帮助(为此我使用了 pr()
函数)。
我注意到我发送的一些数据实际上丢失了。显然,正如 CakePHP 所述,_Token 也丢失了。
我唯一要做的就是在 php.ini
中增加 max_input_vars