PHP 警告 : ページの有効期限切れ
POSTを使繧?なければでないのだが、IEのキャッシュがいっぱい2になったときの臀??様である。
session_cache_limiter('private, must-revalidate');
かならず再読み込みをする。入力フォームで入れた情報が消える場合がある。入力値をクッキーでカバーできるならこれ縺?OK。
session_cache_limiter('private_no_expire');
入力フォームのデータなどは觸??えないが必ずcacheを読むため、リロードで古いものを見せ続ける危険性がある。
<a href="form.php?<?=time(); ?>">Go Form</a>
リンクをユニークにすると藹??ず再読み込みするようになる。
if (0 < count($_POST)) {
session_cache_limiter('private_no_expire');
}
POSTのときだけcacheを有効にする。ブラウザの戻るボタンで戻る縺?POSTできていない先頭ページは入力が消えている。
<a href="form.php?doCache">Go Form</a>
if (0 < count($_POST) || array_key_exists("doCache", $_GET)) {
session_cache_limiter('private_no_expire');
}
cacheしたいとき縺?cache指定、POSTのときは強蛻?cache。
--------------
■PHPのバージョンによるのか新情蝣?
session_cache_limiterの藹??数縺?
none/nocache/private/private_no_expire/public
のいずれかしか藹??け付けず、その臀??の値をセットする縺?publicを指定した場合と同じ縺?session_cache_limiter('private, must-revalidate')はキャッシュ制御ヘッダが送信されない
1) nocache:クライアント/プロキシのキャッシュを無蜉?
2) public:クライアントマシ繝?/プロキシのどちらもキャッシ繝?
3) private:クライアントマシンのみキャッシュ臀??持。Expireヘッダが送信されます
4) private_no_expire:privateと同じだがExpireヘッダはクライアントに送信されません。有効期限切れを回驕?
フォームの入力内容を保持して、ブラウザの戻るで戻りたい場合は、private_no_expireかnoneがいいみたいだ
笳?session_cache_limiter('private_no_expire');
期限切れが出に縺?いがキャッシュばかり使う(静的ページ、静的なページのフォーム)
※運用時縺?private_no_expireでも開発時縺?none縺?
笳?session_cache_limiter('nocache');
戻ると期限切れがでる(動的ページ、フォームには向かない)
笳?session_cache_limiter('none')
キャッシュヘッダを出さず、期限切れが出に縺?縺?適時読み込みをするがブラウザによる(動的なページのフォーム、更新がよ縺?觸??かる静的ページ・??
笳?フォームに戻ってキャッシュ臀??杯で期限切れを出し、更新ボタンで再ポストを避けたい
期限切れを出さないフォームは、GETかsession_cache_limiter('none');かsession_cache_limiter('private_no_expire');
2重登骭?NGなフォームは、DBMS縺?PKやユニークをチェックさせるか、トークンを使うか、処理後リダイレクト
笳?トーク繝?
1)フォーム表示時点で、画面縺?hiddenにキーを、セッションにもキーを仕込んでお縺?。
$taskId = mt_rand();
$_SESSION['taskId'] = $taskId;
print('<form action="submit.php" method="post">');
print('<input type="hidden" value="' . md5($taskId) . '" name="taskId" />');
print('<input type="submit" value="submit" name="submit" />');
print('</form>');
2)登録処理のとき、画面から来たキーとセッションに格軆??されているキーを比較して、正し縺?フォーム表示の画面から遷移しているか確鐔??する。
<?php
//二重登録防止フォーム-登録処理
session_start();
$taskId = $_SESSION['taskId'];
unset($_SESSION['taskId']);
if (md5($taskId) == $_POST['taskId']) {
print('きちんと前の画面からsubmitされています。');
//登録処理後に藹??了画面縺?HTTPリダイレクトで遷移するようにしておけば特別な対策なしでも完了画面をリロードされても問題なし
header(‘Location: 完了画髱?URL’);
} else {
//二重登録された場合や、直接アクセスされた場合の処理
print('フォームを通してアクセスして臀??さい。');
}