ただし、回避できない状況が 1 つあります。
ユーザーがフォームを送信した後、ブラウザの戻るボタンをクリックしてフォーム ページに戻ります。このとき、ブラウザはキャッシュからページを直接取得するため、トークンの検証は失敗するはずです。
インターネット上には、location.replace() メソッドを使用して現在の履歴レコードを置き換えるなど、この問題を回避する方法がたくさんありますが、これにはまだ欠陥があります。極端な場合には、ユーザーがページ間を複数回切り替えた場合、「戻る」ボタンを数回クリックすると、前のフォーム ページに戻る可能性があります。
解決策は、http ヘッダーで Cache-Control: no-cache、no-store を設定することです。ただし、ページヘッドに を追加するか、header("Cache-control: no-cache, no-ストア") は無効です。
長い間検索した結果、ThinkPHP のテンプレート レンダリング メカニズムに問題があることがわかりました。ThinkPHP/Lib/Think/Core/View.class.php を開いて 173 行目を確認してください。
header( "Cache-control: private" ); //支持页面回跳
|
ページ バウンスをサポートするために、TP は各テンプレートが出力される前に Cache-control: private ヘッダーを送信する必要があることがわかりました。これは本当に無駄です。
この行をコメントアウトし、TP コア キャッシュを削除して再試行すると、HTTP 応答ヘッダーが正常に変更されたことがわかります