CakePHP 2.3 を使用しています。セキュリティ コンポーネントをオンにしたところ、postLinks の奇妙な動作に気付きました。何らかの理由で、POST でデータを送信していないように見えますが、代わりに GET を使用しています。呼び出そうとしているアクションで、最初に行うことは、データが POST によって作成されたことを確認することです。
if (!$this->request->is('post'))
{
throw new MethodNotAllowedException();
}
セキュリティ コンポーネントがオンの場合、この if ステートメントは false です。オフの場合、if ステートメントは true です。その他の変更は行われていません。
ポストリンク:
<?php echo $this->Form->postLink($this->Html->image('icons/resend-icon.png'), array('action' => 'resend', $invoice['Invoice']['number']), array('escape' => false, 'class' => 'hastip', 'title' => 'Resend'), __('Are you sure you want to resend this invoice?')); ?>
私が調べた限り、これについての説明は見つかりませんでした。データが実際に POST によって送信されていることを確認できればよいのですが、リクエストが POST であることのチェックを削除すると、他のすべてが機能します。
編集: $this->Security->csrfCheck = false; を設定すると、そして $this->Security->validatePost = false; その特定のアクションの前フィルターでは、この問題はありません。しかし、なぜこれが正確なのかを知りたいのですが。
編集2:
さらに調査した結果、問題のページのビューに別のフォームがあることを発見しました。echo $this->Form->create('Invoice', array('type' => 'get'));
これは、投稿リンクに影響を与えるべきではありません (投稿リンクはフォーム内にないなど) array('type' => 'get')
。 postLinks が機能し始めます。ただし、もう一方のフォームは検索フォームであるため、get 型にする必要があり、URL に検索クエリ文字列を含める必要があります。
編集3:
検索フォームを投稿リンクの下に移動すると、問題も解決することがわかりました。html バリデーターを使用してマークアップを実行して、不正な形式がないことを確認しようとしましたが、何も報告されませんでした。
編集4:
PostLinks 用に生成されたマークアップが正しくないことを発見しました。CSRF の検出に使用される非表示の入力の名前が間違っているため、CSRF テストに失敗します。したがって、リクエストはブラックホールになっています。http:// を https:// にリダイレクトするブラックホール コールバックを設定したため、ページがリダイレクトされ、同じページに対する新しい get 要求が発生し、MethodNotAllowedException によって拒否されます。PostLinks が正しく生成されない理由を調査しようとしています。