あなたの問題はfubar改行だと思います:)ログインページの参照を追加しました。これは、ログインが失敗した場合にチェックするセッション変数の設定を解除しています。
タグを配置する場所には十分注意してください。また<?php ?>
、db.php インクルードなどの .inc ファイルでは、?>
最終行の終了タグを省略して、誤って ENTER を押してから CTRL + S を押して、不要な改行文字が入り込むのを防ぐことができます。出力バッファ (ob) に。ob_start がアクティブ化されている場合、選択またはスクリプトの終了前にサーバーから何も書き込まれません。そうでない場合は ELSE です。デフォルトでは、\n ごとに出力がフラッシュされ、ペイロードのコンテンツ部分が開始されます。
login.php:
<?php
session_start(); // put this on top-most line in your script
$ok = check($_POST['user'], $_POST['pass']);
if($ok) {
$user = db_get_user_creds($_POST['user']);
$_SESSION['name'] = $user['name'];
$_SESSION['job_title'] = $user['job_title'];
} else {
// session_unset();
unset($_SESSION['name']);
unset($_SESSION['job_title']);
}
?>
admin.php
<?php
session_start(); // put this on top-most line in your script
// or, use ob_start at the very first line
// (with no widespace what so ever written out before it)
include('db.php');
?> I am writing out a newline here, session / header section is going to become unstable
<?php
// Inialize session
// @session_start(); moved up top
ob_start();
// Check, if username session is NOT set then this page will jump to login page
if (!isset($_SESSION['name']) || ($_SESSION['job_title'] != "admin")) {
header('Location: index.php');
}
ob_flush();
?>
「ここに改行を書き込んでいます」ビットを参照してください
うさぎの穴はもう少し深くなります。通信の流れは次のようになります。
1) HEADERS such as
Connection: keep-alive\r\n
Content-Type: text/html\r\n (etc)
2) DOUBLE NEWLINE (one newline with no previous chars on that line)
\r\n
3) CONTENTS
Body
Of Page