• 締切済み

IE8の挙動について

初めて質問させて頂きます。 IE8の挙動でかなり困っております。 症状としては、 # A.php 入力フォーム  セッションにGETパラメータの値を格納し、その後フォームを出力するページです。 #B.php 入力確認ページ  A.phpで入力された内容をプログラムで入力チェックし、エラーがあった場合はエラーページへリダイレクト。 #index.php トップページ http://example.com と言う基本的なページなのですが、 A.php から B.phpへ遷移した際に、IE8の一部の環境(?)でエラーと判断されてエラーページにリダイレクトされてしまいます。 入力項目に不備は無く、よくよく調べていくと、A.phpで格納したはずのセッションパラメータが消えてしまっていました。 直接B.phpが呼ばれたのかと考え、アクセスログを確認したところ、正常の遷移でした。 そこでアクセスログを確認していたところ、 A.phpを開いた際に、何故か同一のクライアントからindex.phpへのアクセスが入っている様でした。 つまり、  url: A.php?id=xxxxx 接続   ↓  セッション格納   ↓  HTML出力   ↓  終了 これが正常の動きなのですが、 出力されたHTMLの中で、index.phpへ勝手にアクセスが発生していました。  url: A.php?id=xxxxx 接続   ↓  セッション格納   ↓  HTML出力   ↓ → index.phpへアクセス  終了 このindex.phpの中では不要なセッションを削除する処理が動いている為、削除されてしまっている為に、 A.phpの表示は正常だが、次にB.phpへ遷移した時にパラメータが不正の為、エラーとなっている。 と言う状況だと思われます。 最初クッキーが無効になっていないとか、JSとかも疑いましたが、そこはクリアでした。 ページ内で画像タグ等でindex.phpへのurlが記載されていないか確認しましたが、その様な記述はありませんでした。 一箇所だけトップページへのリンクが記述されているだけでした。 これが怪しいとは思いますが・・・・ 一番厄介なのが、この症状はIE8であれば全員出るかと言ったら違う様で、 殆の人が正常に機能しています。 極一部の方だけ発生している様です。 このサイトは15万人以上の会員を抱えていて、現在運用中のサイトで、この症状はそのサイトのお客様に発生しています。 その為、電話越しに一つ一つ確認する事も出来ず・・・・ 社内の人間や、知人等にもお手伝い願ったのですが、再現せずに困っております。 最初一人だけだったのですが、二人目の方からも電話がコールセンターに来てしまっており、 一人目の人には散々待たせてしまっているので、若干ご立腹状態らしく・・・ 二人の環境は  OS XP IE8  OS 7 IE8 です。 共通項はIE8となります。 何らかの設定が悪さしているのかとも考えていますが、社内のPCで設定をいじりまくっても再現せずです。 もう一つの共通項として、ふたりともOSって何?と言うレベルの方たちなので、設定をいじっているとも思えません。 息子さんか誰かがいじっているのかもしれませんが・・・・ http://d.hatena.ne.jp/chiheisen/20090831/1251733258 ここに書かれている内容が微妙に近いので、探したのですが、 baseタグは特に使用しておりません。 ただ、この辺りだろうなとは考えていますが、いかんせん再現させる事が出来なく・・・・ そしてお客さんに聞く事も出来ず・・・・ お手上げ状態です。 何方か御存知の方おられましたらご教授頂けますと助かります。 また、これ以上に必要な情報等御座いましたら出せる範囲となってしまいますが、お出しします。 ※サイトが特定されかねないので、すみません;; 以上何卒宜しくお願い致します。

  • HTML
  • 回答数1
  • ありがとう数1

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

IE8から、firefoxなどにあった先読み機能が取り入れられましたfirefoxだと、確かnetwork.prefetch-next関連の設定で、そのページにあるURLに対してあらかじめ先読みをしておいて、リンクが有効になった時点ですでにデータをダウンロードして置くことで表示を早める機能です。 >JSとかも疑いましたが、  これは、IE8には、base hrefを指定している場合、誤って解釈するバグのことかな? (もしbase hrefを設定しているなら・・・・  formが送信されたとき、隠しnameを合わせて送らせて、それをチェックすることでブラウザの先読みによるものの場合は、セッション管理をキャンセルするなどの対応がよいかも・・  他のブラウザでは??

gonzares328
質問者

お礼

ご回答ありがとうございます。 先読み機能が悪さしているんであろうと言うのはなんとなくわかるのですが、これってデフォルトで有効になっているんですかね・・・ この設定の確認方法を調べてみます。 ググッても中々出てこなくて。。。 みんな同じ症状が出ていれば良いのですが、再現しないものですから。 一応index.php内でセッションをけしている部分は解除しても問題無い部分なので、一旦コメントアウトして様子見てみます。 全く関係ないとは思いますが、無理矢理IE7互換モードにしてみてはどうかと思い、metaに書いてみていますが(笑)

関連するQ&A

  • IE9でセッションが保持できないのは?

    お世話になります。 現在会員サイトでindex.phpというファイルにアクセスする際にSESSION["id"]が空欄の場合、エラーページへ飛ばすというプログラムがあります。 ■index.php内のソース $headerLink = ""; if($_SESSION["id"] == ""){ $headerLink = "../error.php"; header("location:".$headerLink); } var_dump($_SESSION["id"] ); IE9の場合のみ上記でエラーページに飛ばされてしまい、その他のブラウザ(FireFox、Chrome、IE8以下)ではエラーが表示されないのですが、IE9では何か特別なSESSIONへの条件などがあるのでしょうか? var_dumpを確認してもいずれも値が入っていました。 (ちなみに上記のエラーページに飛んでしまうのは「IE9を開いて初回ログイン(index.php)にアクセスした場合のみです。エラーページにジャンプ後、再度ログインをしindex.phpにアクセスするとエラーはでなくなります)

    • ベストアンサー
    • PHP
  • php セッション 戻る時に消える

    php セッション 戻る時に消える お世話になっております。 ページ遷移においてデータの受け渡しをセッションを利用して行っております。 「入力ページ」⇒「確認ページ」⇒「完了ページ」 確認ページでpostデータをセッションに格納しております。 そこで質問です。 「入力ページ」⇒「確認ページ」⇒「入力ページ」の場合、確認ページでセッションに格納しているデータを、 入力ページに戻った段階で呼び出すことは可能でしょうか。 そもそも戻った場合はセッションは消去されてしまうのでしょうか。 ちなみに、「入力ページ」はhtmlですが、phpを使用できる状態にしてあります。 色々と検索したのですが私の力不足で該当する内容にめぐり合えませんでした。 お力をお貸しください。

    • 締切済み
    • PHP
  • プログラムの挙動が・・・

    orderform1.php→orderform2.php(form action="confirm_form2.php")→orderform3.php→complete.phpという流れの、ショッピングカート的なものを作っています。 そこで問題が起こっているのですが、 1,orderform2.php→orderform3.phpに遷移する時、入力したはずの$_SESSION['family']が表示されない。(同じ手順を踏んでいる他の$_SESSION['']は表示される) 2,orderform3.phpはいわゆる確認ページなのですが、そのページのリンクからorderform1.phpに戻り、手順に従って再びorderform2.phpにアクセスすると内容が表示されない(orderform3.phpからorderform2.phpに戻った場合は表示される) 3,テキストボックスの内容はsessionで表示させられるが、オプションボタン・チェックボックス・プルダウンメニューを入力時の状態に保持することができない(分からない) 1は恐らく、orderform2.phpかconfirm_form2.phpどちらかが原因だと思うのですが・・・ ▼confirm_form2.php session_start(); $_SESSION['error']=""; $family=$_POST['family']; $name=$_POST['name']; $huri_fami=$_POST['huri_fami']; $huri_fir=$_POST['huri_fir']; $zip=$_POST['zip']; $pref=$_POST['pref']; $add1=$_POST['add1']; $add2=$_POST['add2']; if($_POST['add3']==""){ $add3=""; }else{ $add3=$_POST['add3']; } $tel=$_POST['tel']; $email=$_POST['email']; $time=$_POST['time']; if(isset($family)){ $_SESSION['family']=$family; } if(isset($name)){ $_SESSION['name']=$name; } if(isset($huri_fami)){ $_SESSION['furi_fami']=$huri_fami; } if(isset($huri_fir)){ $_SESSION['huri_fir']=$huri_fir; } if(isset($zip)){ $_SESSION['zip']=$zip; } if(isset($pref)){ $_SESSION['pref']=$pref; } if(isset($add1)){ $_SESSION['add1']=$add1; } if(isset($add2)){ $_SESSION['add2']=$add2; } if(isset($add3)){ $_SESSION['add3']=$add3; } if(isset($tel)){ $_SESSION['tel']=$tel; } if(isset($email)){ $_SESSION['email']=$email; } if(isset($time)){ $_SESSION['time']=$time; } if($_SESSION['family']=="" && $_SESSION['name']==""){ $error.= "名字、名前が入力されていません。<br>"; }else if($_SESSION['family']==""){ $error.= "名字が入力されていません。<br>"; }else if($_SESSION['name']==""){ $error.= "名前が入力されていません。<br>"; } if($_SESSION['huri_fami']=="" && $_SESSION['huri_fir']==""){ $error.= "名字、名前のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fami']==""){ $error.= "名字のフリガナが入力されていません。<br>"; }else if($_SESSION['huri_fir']==""){ $error.= "名前のフリガナが入力されていません。<br>"; } if(!eregi('[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]', $_SESSION['zip'])){ $error.= "郵便番号が正しく入力されていません。<br>"; } if($_SESSION['add1']==""){ $error.= "市区町村が入力されていません。<br>"; } if($_SESSION['add2']==""){ $error.= "番地が入力されていません。<br>"; } if($_SESSION['pref']==""){ $error.= "都道府県が選択されていません。<br>"; } if(!eregi('[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]', $_SESSION['tel'])){ $error.= "電話番号が正しく入力されていません。<br>"; } if(!eregi('[a-z0-9._\-]+', $_SESSION['email'])){ $error.= "メールアドレスが正しく入力されていません。<br>"; } if($_SESSION['time']==""){ $error.= "時間帯指定が選択されていません。<br>"; } if(isset($_SESSION['error'])){ $_SESSION['error']=""; $_SESSION['error']=$error; }else{ $_SESSION['error']=$error; } header("Location: orderform2.php"); if(!$family=="" && !$name=="" && !$huri_fami=="" && !$huri_fir=="" && !$zip=="" && !$pref=="" && !$add1=="" && !$add2=="" && !$tel=="" && !$email=="" && !$time==""){ header("Location: orderform3.php"); }  長くて申し訳ないですが、少しでも分かる方、どなたか知恵をお貸しください。  他のPHPのソースは載せきれないので、補足要求があれば載せます。

    • 締切済み
    • PHP
  • フォームの入力値のセッション破棄は?

    Aフォームがありまして、入力して確認ボタンを押し、セッションに入力値が格納されたけど、途中でBフォームへ行ってしまった、という場合、いつまでもAフォームの入力値をセッションに格納しておいても使わないですし、セッション変数名が競合して予期しない動作をしても困るので、他のページへ遷移した時点でAフォームの入力値セッションを削除するようにしたいのですが、実装方法としては、URLまたは絶対パスをセッションに入れといて、画面遷移するごとにそのセッションとURLまたは絶対パスを突き合わせ、一致しなければ削除、というやり方で問題ないでしょうか? ロードバランサ使ってても同一ページなら絶対パスは変わらないのでしょうか??詳しくないんですが…。 美しい実装方法をご教示ください…。

    • ベストアンサー
    • PHP
  • php フォーム開発 IE9のみセッション消滅

    フォーム機能での、「入力画面」>「確認画面」>修正するボタン>「入力画面」 という流れの中の、ブラウザIE9でのセッションの消滅について質問させてください。 はまってしまってから3日になります。とうとう力尽きました。 IE9以外の下位バージョンやFireFoxでは問題なく動きます。 まず、環境から。 xmpp 1.7.3 PHP 5.3.1 MySQL 5.1.41 Smarty 3.0.7 ※同一ドメインで、フォームを複数運営させるため、 各フォームのそれぞれの項目(ラジオ,チェックボックス,テキストエリアなど)を管理画面から一意の値と共にDBに格納しています。 各フォームを表示する際は、その一意の値を呼び出して出力しています。 次に、処理の流れです。 (1)「入力画面」では、各入力項目をDBから取得し、少し整形してフォーム画面を出力しています。 Smartyを使っていますので、テンプレートへ アサインする形です。 ※この際、$_SESSION["f"]["no"]に、フォームを大別する一意の値を入れています。 閲覧者が入力した内容は、自身「入力画面.php」にポストして、 空の判別後、$_SESSION["f"]["別の一意の数値"]に保存します。 その直後、エラーチェック関数にそのセッションを通して、通過すれば「確認画面」へリダイレクトします。 /*下記のように*/ $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/確認画面.php"; header("Location: ".$url); exit; (2)「確認画面」では、 「入力画面」を経由したかどうかをphpの先頭でチェックします。 上述の$_SESSION["f"]["別の一意の数値"]を使って、同じエラーチェック関数で審査を行い、 通過すれば「確認画面」を表示するようにしています。 ※実際は、このチェックの前に$_SESSION["f"]["no"]を使ってDBから値を取得したりしています。 /*下記のように*/ $p[2]=フォーム取得関数($_SESSION["f"]["no"]);//DBからフォームに関する個別の値を取得。 if(count($p[2])!=0){ if(エラーチェック関数($_SESSION["f"])){ //エラー 入力画面経由ではないので 「入力画面」へ戻す $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: " . $url); exit; } }else{ //エラー フォーム関連パーツを取得できないので 「入力画面」へ戻す $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: " . $url); exit; } (3)問題なければ、 「確認画面」が表示されます。 (4)内容を修正するのであれば、 「修正するボタン」を押して >「入力画面」へと遷移させます。 /*下記のように*/ <テンプレート内> <form action="確認画面.php" method="post"> <input type="submit" name="modify" value="   修正する   "> </form> <確認画面.php内> if(isset($_POST["modify"]){ $url = "http://".$_SERVER["HTTP_HOST"].dirname($_SERVER["SCRIPT_NAME"])."/入力画面?no=".$_SESSION["f"]["no"]; header("Location: ".$url); exit; } (5)確認画面からゲットでnoの値を受ける(入力画面にて) <入力画面.php内> if(isset($_GET["no"]) && is_numeric($_GET["no"])){ //$_GET["no"]つまり$_SESSION["f"]["no"]を使ってDBの値取得 } そしてセッションを維持したままなので、前回の入力項目を修正することができる。 これらの一連の流れは、IE9以外だと正しく動きます。 IE8も含めIE7 IE6 でも正常に動きます。 しかし、(4)の段階で、$_SESSION["f"]["no"]の値が消滅している為か、「入力画面」へと戻ることができません。 細かく言えば、(2)や(3)の段階(最初の「確認画面」へと遷移した時点)では、$_SESSION["f"]["no"]値は生きているようです。 (4)の段階の修正するボタンを押すと消滅しているようです。 <form action="確認画面.php" method="post"> <input type="submit" name="modify" value="   修正する   "> </form> これをポストして、自身「確認画面.php」に再度アクセスすると、 $_SESSION["f"]["no"]が消滅しているようです。 ただ、おかしなことに、確認画面.php内のどこかに print_r(変数); 入れてやると、一応_SESSION["f"]["no"]の値は維持されるようで、 元の入力画面へと遷移できてしまいます。 ※ただ、元の入力画面に戻ったときには、_SESSION["f"]["no"]は消えているようです・・・・。 ※print_rが発動したphpファイルだけが大丈夫なようです。 いろいろネットで検索をかけました。 ドメインにアンダーバーを使ってはダメだとか、session_idやname のことも調べましたが、 どうも該当している問題ではなさそうなんです。 セッションについて理解が深くない自分ですが、session_idが関連づいていない? 他のブラウザやバージョンでは問題なしだが、 IE9のみ特殊な仕様で、header("Location: " . $url);を使うとセッションを関連付けしてくれない? ということなのかなと推測していますが。 もう自分の力量ではどうにもならず・・・・。 そもそも上記のプログラムの流れで、 他のフォームも沢山作ってきましたが、いままでこのような問題には遭遇しませんでした。 正しく稼動しています。 「入力画面」から「確認画面」へは、セッションを使って安全に遷移したいので、 他の方法をとるのは厳しいかなと・・・。 どうぞお力をお貸しください。 何卒よろしくお願いします。

    • 締切済み
    • PHP
  • セッションが引き継げません

    PHP5.3 + Apache2.2 Windowsです。 IE7でページ遷移を行うと、セッションが引き継げず、新しいセッションが作成されてしまいます。(Chromeでは引き継げます) セッション保存フォルダに新しいセッションファイルが生成されていました。 以下ソースコードです。 $_SESSION['hogehoge'] = 'xxxx'; header("Location:sapmle.php"); sapmle.phpで$_SESSION['hogehoge']を参照すると、エラーになる。 エラー内容:Notice Undefined Index 'hogehoge' また、<a href="sample.php">次のページ</a> と記述したリンクをクリックしても同じエラーになります。 php.ini の use_trans_sid を Onにすると、エラーは出ません。 use_only_cookies を OnしてもOffにしてもエラーは出ました。 use_trans_sid が Offでも header("Location:sapmle.php?" . session_name() . "=" . session_id()); と書くとエラーは出ません。 エラーが出なくなれば良いので、use_trans_sid を Onにしたり、URLにセッションIDを付与すれば良いのかもしれませんが、 これらの処置はセキュリティ上良くないと聞いたことがあるので、どうするのがいいのかわかりません。 わかる人教えてください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 処理中に変数の値が変わってしまう

    Webページでセッションに値を格納し処理を行っています。 クラスをserialize()しセッションに格納して同じページで利用しています。 このセッションに格納した値がFireFoxでは想定通りに動くのですが、 IE6.0だと特定の個所のみ突然値が変わってしまいます。 ページの一番最後で出力したセッションの値が、 次ページの一番最初で出力した場合値が変わっています。 ファイルにserialize()したデータを書き込んで見たのですが、 正しいデータを持っているにもかかわらず、 書き込んだデータは異常な値でした。 また、書き込んだ後に画面に値を表示しても正常に表示されました。 $aを画面に表示     → 正常 $aをファイルに書き込み → 異常 $aを画面に表示     → 正常 環境は PHP5.1.2 Apache2.0.48 RedHatLinux9 です。 宜しくお願いします。

    • 締切済み
    • PHP
  • Apache単体でセッションIDを発行しログに記録できますか?

    GETパラメータで渡したセッションIDをApacheで引き継いで ページ遷移してもセッションIDをログ出力する事は可能でしょうか? ※Apacheモジュールを入れて設定することでもOKです。 又、GETパラメータでセッションIDを渡すのではなく、 ApacheでセッションIDを発行する事は可能でしょうか?

  • docomoのセッションが切れてしまうのは?

    携帯サイト用のセッションでdocomoの時だけ思うように フォームによるページ遷移ができません。 色々試してみたのですが、サッパリです。 どなたかお知恵をお貸し下さい。 例) -- page01.php -- session_name( "test" ); session_start(); session_regenerate_id(true); $test = session_name()."=".session_id(); if ( ( $smp01 = auth() ) == FALSE ) { header( "Location: ./test.php?redirect=index_test.php?" ); exit; }←ログイン時の処理(ユーザー定義関数にて) ・        ・        ・        ・ <form action="page02.php?<?= $test ?>" method="get" /> 入力:<input name="test01" type="text" value="" /> <input name="smp02" type="submit" value="next" > </form> ↑入力させてpage02.phpにて処理 上記のようにしているのですが、 submitするとログイン時の処理に掛かってセッションが切れてしまい ログインページに戻ってしまいます。 ログイン時の処理を削除するとpage02.phpへと遷移します。 ログイン時の処理を残したままセッションが切れずにフォームによる ページ遷移ができるようにするにはどのようにすれば良いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • AからBへセッション変数の受け渡し(ページ間の移動うまくできない)

    Aプログラム後半部分より //下記をセッション変数に登録 //$_SESSION[セッション変数名] = 値; $_SESSION[suid] = $uid; print "uid = ".$_SESSION[suid]. "<br>"; //確認してます //ページをadminpageに飛ばす ?><BR> <a href="adminpage.php">認証されました。管理者ページへ</a> </body> </html> Bプログラム前半部分/*管理者ページadminpage.php*/ session_start(); print "uid = ".$_SESSION[suid]. "<br>";//確認表示 // いきなりこのページにアクセスがあった場合 if( !$_SESSION[suid] ){ session_destroy(); header("Location: index.php"); exit; } ?> というプログラムですが、Bのプログラムの確認表示部分で"$_SESSION[suid]"が表示されません。Aプログラムでは表示されます。 プログラムの他の部分は個別に動作確認済みです。 エラーとして、ユーザーページの移動時(成功プログラム)に使った$_SESSION[suid]の値が表示されたりもします。原因を教えて下さい。

    • 締切済み
    • PHP

専門家に質問してみよう