IEやEdgeでhistory.back()や「戻る」ボタンで戻った時に消える時の対処法
PHPでセッションの使用 session_start(); を実行すると、ブラウザのHTTPヘッダには
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
というのが必ず送られます。
これが送られるとそのページはキャッシュされないので、例えばフォーム入力画面の場合
次の確認画面から history.back(); で返ってくると、入力欄が消えてしまいます。
(ただし Google Chrome の場合は消えない場合が多いので、必ずIEやEdgeで確認しましょう。)
そこで 次の方法で対処できます。
session_start();
// セッション使用時にブラウザキャッシュを有効にする
header('Expires: -1');
header('Cache-Control:');
header('Pragma:');
記述場所は 「session_start() の後」かつ「何か画面に出力する前」です。
session_cache_limiter('public'); // セッション使用時にキャッシュを使えるようにする
// ↓PHPのデフォルト値は 180 です
session_cache_expire(60); // セッション時のキャッシュ有効時間 60分(1時間)
session_start();
とすると、セッション使用時にもキャッシュ可能になります。
session_cache_limiterの引数 | 説明 |
---|---|
none | no-cacheヘッダを送信しない |
nocache | no-cacheヘッダを送信する |
private | キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない) |
private_no_expire | キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない) |
public | キャッシュを利用する |
ちなみにセッション自体の有効時間は
ini_set("session.cookie_lifetime", 28800); // セッション有効時間 60*60*8(8時間)
として指定します。
Smartyテンプレート内でセッション変数、cookie、環境変数の値を参照したいときは下記のようにします。
phpのセッション変数"id"の値を表示
{$smarty.session.id}
クッキーに登録された"username"の値を表示
{$smarty.cookies.username}
環境変数"PATH"の値を表示
{$smarty.env.PATH}
環境変数 "SERVER_NAME" の値を表示
{$smarty.server.SERVER_NAME}
環境変数 "HTTP_USER_AGENT" の値を表示
{$smarty.server.HTTP_USER_AGENT}
■ ただし Smartyで全ての環境変数が取得できるわけではありません。
なので
{ foreach from=$smarty.server key="k" item="v" } {$k}:{$v} { /foreach }
としてどういう環境変数が取得できるのかを調べるのがいいでしょう。
(一部の)携帯などでcookieを使えない場合にセッションIDをURIに埋め込んで使用する方法が一般的です。
そこで
・cookieを受け付けるときはcookieを使用したセッション。
・cookieを受け付けないときはURI埋め込みを使用したセッション。
を実現します。
php.ini の設定
session.use_cookies = 1 session.use_only_cookies = 0
としてapache をリスタート
apachectl graceful
で準備OK。
後はPHPスクリプト内で
定数SID が存在するブラウザの場合 → cookie使用不可(携帯など)
定数SID が存在しないブラウザの場合 → 通常のWEBブラウザ
で判別できます。
session_start(); if (SID){ // cookieを使えないブラウザの処理 } else { // cookieを使えるブラウザの処理 }
セッションは通常cookieを通してやりとりしますが、cookieを使えないブラウザ
(携帯端末 Docomo Softbank )等でセッション機能を実現させたい場合はセッションIDを
URIに埋め込んで使用することになります。
■ セッションをURLに埋め込んで使用するには以下の記述を行います。
session.use_trans_sid = 1
php_flag session.use_trans_sid On
ini_set('session.use_trans_sid', '1');
ただし
注意: 相対URLでないURLは外部サイトを指していると仮定され、SIDが追加 されません。これは、SIDを外部のサーバに開示することはセキュリティ 上のリスクとなる可能性があるためです。
なので注意
■ セッションに関するパラメータを変更するには phpコード内に以下の記述を行います。
が、通常書き換えなくてもOKです。
//一文字あたりのビット数(4,5,6)数値が大きいほどセッションIDを短くすることが出来る ini_set('session.hash_bits_per_character', 6); //セッションパラメーター名 デフォルト値:PHPSESSID ini_set('session.name', '_SESSID'); //ハッシュ関数 0:MD5(128bits) 1:SHA(160bit) デフォルト値:0 ini_set('session.hash_function', 1);
参考:
http://labs.scyphus.co.jp/memos/php/session
http://www.yc.musashi-tech.ac.jp/~yamada/doc/php/0802.html
http://ke-tai.org/blog/2007/12/12/php_session_new/