1

サーバーの 1 つに、次のようなかなり古い php 認証スクリプトがあります。

ob_start();

$log = new Auth();
// returns true
$checkSession = $log->checkLog();

 if(!$checkSession){

    header("Location: ../index.php");
    exit();

  }else{

    include "content/".$_GET["content"].".php";

   }

$content = ob_get_contents();
ob_end_clean();

include "../".WEBROOT_TEMPLATE_FILE;

それは常にスムーズに機能していました (認証されたユーザーはページにアクセスでき、認証されていないユーザーはホームページにリダイレクトされました) ... 今日まで !

まったく知られていない何らかの理由で、ユーザーが Access 2000 データベースによって生成されたリンクからサーバー ページの 1 つにアクセスしようとすると、常に index.php にリダイレクトされます。

奇妙なことに、URL をブラウザに直接貼り付けても問題なく動作します。どちらの場合も、URL はまったく同じで、$_SERVER 変数も同じです。同一の HTTP ヘッダーも確認しました。

また、リダイレクトにコメントすると、うまくいきます:

 if(!$checkSession){

    //header("Location: ../index.php");
    //exit();

  }else{
    // that part is executed
    include "content/".$_GET["content"].".php";

   }

誰かがここで同じ問題を抱えていましたが、悲しいことに有効な回答が得られませんでした:ヘッダー(場所: xxx) が内部にある場合、PHP の if-statement は無視されました

何か案が ?

よろしくお願いいたします。

編集:解決策を見つけました

何らかの理由で、Apache サーバーは Access 2000 データベースによって生成された http 要求を気に入らず、変更されたヘッダー (特に http 受け入れ) を使用して新しい要求を発行しました...悲しいことに、最初の要求はセッションを初期化しませんでした... したがって、index.php へのリダイレクト。

したがって、(醜いが機能する)解決策は、私にとって:

if($_SERVER['HTTP_ACCEPT']!="*/*"){
// Do your stuff
}
4

3 に答える 3

0

これを試して:

header("Location: http://site.com/index.php");
于 2012-05-21T17:36:13.043 に答える
0

@MonkeyMonkeyが言ったように、ヘッダー/クッキーがすでに送信されており、スクリプトがセッション認証に到達してリダイレクトするまでに、それらを再送信できないという事実に関連している可能性が最も高いです。

error_reporting を E_ALL に設定すると、「Warning: headers already sent 」というメッセージが表示されます。

出力が開始された場所については、特定するのがかなり難しいでしょう。ob_start の前にインクルードされた事実上すべてのファイルは、末尾にスペース/タブ/改行を含めることができます (末尾の?>の後)。

于 2012-05-22T10:06:28.070 に答える
0

これを後に追加しますob_start()

if(!isset($_SESSION)) {
      session_start();
}

この後、変数$_SESSION[]が設定されていて、値があるかどうかを確認します。

if(!isset($_SESSION['username']) || $_SESSION['username'] == "") {

  header("Location: ../index.php"); //redirect unauthorized users
  exit();
}
else {
 // your code
}

注:上記のコードは単なる例です。使用する前に必要に応じて変更してください。

于 2012-05-22T10:18:56.920 に答える