1

ログインページ($ _SESSION ['login'])からセッション変数を設定しています。徹底的にテストしました。変数は確実に作成され、正しい値が保存されています($ _SESSION ['login'] = '1')が、Chrome、Opera、またはFirefoxを使用している次のページで変数が認識されません-奇妙なことに、SafariとInternetExplorerで期待するのと同じスクリプトが機能します。

どんな助けでも大歓迎です-私はこれをしばらくの間理解しようとしていて、それを得ることができません-私はここで完全に途方に暮れています。

これがステップバイステップです-

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:inside_page.php');

    // echo $_SESSION['login'] ;
    // ----------------------
    // commenting out the redirect and echoing
    // the session variable works as expected
    // in IE, Safari, Chrome, Opera and Firefox
}

?>

これが私のCheck_loginクラスです-次のページ(inside_page.php)でインスタンス化されます-

クラス:

<?php

if (! defined('EXT')){ exit('Invalid file request'); }

class Check_login { 
    private $login = null ;

    function __construct() {
        session_start();
        $this->login = $_SESSION['login'];
        if ($this->login != '1') {
            header('location:../index.php');
        }

        // $login = $this->login ;
        // echo $login ;
        // $session = $_SESSION['login'];
        // echo $session ;
        // ----------------------
        // commenting out the redirect and echoing the
        // session variable shows 1 in IE and Safari, but
        // empty in Chrome, Opera and Firefox
    }

}

?>

ページ(inside_page.php):

<?php

require('../lib/Check_login.php');

session_start();

$login = new Check_login;

?>

繰り返しになりますが、どんな助けでも本当に素晴らしいでしょう。ありがとう!

4

4 に答える 4

3

私はこれを理解しました-なぜこれが当てはまるのか理解できませんが、これが私の問題を解決したものです。ログインページで、ログインクレデンシャルを確認した後、セッション変数'login'を1に設定してから、別のページに明示的にリダイレクトしました。テストの結果、リダイレクトに相対URLを使用すると問題が解決したことがわかりました。

私の元の投稿では、必要だとは思わなかったため、URLについても説明していませんでしたが、ここに問題がありました-

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:https://www.somedomain.com/inside_page.php'); // *** PROBLEM
}

?>

場所を比較的設定することで、私の問題は解決しました-

<?php
// log in page
// if logged in successfully set the session variable

session_start();

if (// log in credentials good) {
    $_SESSION['login'] = '1';
    header('location:inside_page.php'); // *** FIX
}

?>

私は再確認しましたが、安全な接続は間違いなく問題ではなく、明示的なURLでした。

相対位置を使用すると、セッション変数がInternet Explorer、Safari、Chrome、Opera、Firefoxの次のページに表示されました。明示的な場所を使用すると、IEとSafariに表示されましたが、CHROME、OPERA、FIREFOXには表示されませんでした。

これを簡単に再現して、自分で試すことができます-

<?php

// ------- page_one.php -------

session_start();

$_SESSION['val'] = '1';

header("location:http://www.somedomain.com/page_two.php") ;
// header("location:page_two.php") ;

?>

<?php

// ------- page_two.php -------

session_start();

if ($_SESSION['login'] != '1') {
    echo 'false' ;
} else {
    echo 'true' ;
}

?>

うまくいけば、これは他の誰かの時間を節約します(そして頭痛)。

于 2012-09-05T12:09:29.347 に答える
0

session_start()inside_page.phpのrequireステートメントの上に移動します。

セッションは、スクリプトの最初から開始する必要があり、ほとんどの場合、インクルードの前に開始する必要があります。

于 2012-09-04T15:31:48.703 に答える
0

私はdigitalaccesspass(DAP)をPHP5.5サーバーに統合しようとして同様の問題を抱えていました(すべてのWebkit / Blinkブラウザーで壊れたため、Chrome、Safari、およびOperaのログインを壊しました)。

  • オーセンティケーターの最初の行がsession_start()
  • header("Location:")すべてのリダイレクト(呼び出し)の直前に追加しましsession_write_close()た。
  • リダイレクトは、絶対パスではなく相対パスになるように編集されました。

Google経由でこれに遭遇した人のために、DAPでこれにぶつかっている場合は、/ dap/authenticate.phpでこれらの変更を行ってください

于 2013-10-11T01:00:04.080 に答える
0

私のPHPセッションもChromeで機能していませんでした。

session_start()各ページが単に各セッションを初期化するために使用しているにもかかわらず、PHPSESSIDCookieパスがページ間で同期されていないことがわかりました。

セッションにデータを書き込んだページに上記session_start()の行を追加すると、問題が解決しました。

session_set_cookie_params(600, '/');

見る:

http://php.net/manual/en/function.session-set-cookie-params.php

于 2017-03-02T05:49:24.267 に答える