ユーザーがログインしているかどうかを確認するPHPスクリプトを作成してcheck.php
います。ユーザーは1人しかいないため、パスワードはphpコードに直接記述されています。はcheck.php
、関連するすべてのページの上部 (1 行目) の行に含まれています<? include "check.php"; ?>
。
コード
パスワードとドメイン名を削除しました。それとは別に、以下は私のコードです。ここでのポイントは、ログイン ページでパスワードを入力し、POST でこのスクリプトに送信することです。
パスワードが正しいxxxの場合、セッションlogin
はtrue
.
パスワードが正しくなく、設定されている場合、つまりユーザーが何か間違って入力したことを意味し、既存のセッションは で終了し、ユーザーsession_destroy()
がログアウトしたことを意味します。
彼がページに到達してもログインしていない場合、セッションlogin
は false または未設定である必要があります。これは、} elseif(!($_SESSION['login'])) {
が使用されることを意味します。
最後に、ログアウトボタンをクリックすると、次の URL のスクリプトに送信されますcheck.php?logout=true
。は最後の elseif ステートメントでlogout=true
キャッチされ、セッションはそこで終了する必要があります。$_GET
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
} elseif (isset($_POST['password'])) { // Wrong password
session_destroy();
header("Location: http://www.url.com/administration/login.php?true");
} elseif(!($_SESSION['login'])) { // Check at every page
header("Location: http://www.url.com/administration/login.php");
} elseif($_GET['logout']) { // Log out
session_destroy();
header("Location: http://www.url.com/");
}
ob_flush();
?>
問題
すべての if ステートメントで、リダイレクトを試みます。を使用してheader("Location:...)
いますが、いずれの場合も機能しません。header
コマンドは、仕様に従ってブラウザーに送信される最初の要求でなければならないため、ここで説明されているようにob_start();
andを使用しました。これらの有無にかかわらず機能しません。ob_flush();
また、コンテンツを保存しないセッションにも問題があります。true
なんらかの理由でセッションに保存できません。コードに失敗する問題はありますか?
テストとして、すべての/ステートメントecho
にコマンドを記述しようとしました。そのことから、スクリプトは常に 3 番目のステートメント (. を持つステートメント) に入ることがわかりました。if
ifelse
!($_SESSION['login'])
質問
ここまでは順調ですね。これは、スクリプトがセッションが設定されていないことを検出できることを示しています。
残る2つの問題は次のとおりです。
- リダイレクトが発生しないため、ステートメントのリダイレクトが機能しない理由
- そもそもセッションを設定できない理由。
アドバイスをいただければ幸いです。
更新 1
何が起こるか (そして何が起こらないか) を明確にするために、いくつかecho
の を別の場所に入れました。いくつかの追加の s を含む上記のコードのこのスニペットecho
:
...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];
if($_POST['password'] == 'xxxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
echo "<br>Session after: " . $_SESSION['login'];
echo "<br>The first if works";
} ...
次の出力を返します。
Input: xxxx
Session before:
Session after: 1
The first if works
(xxxx はパスワードです。正しいです。)
これは、ログインしている状況です。パスワードを書き込んで、 に送信されましたcheck.php
。
if
したがって、ここで、想定どおりに最初にアクセスすることがわかります。true
また、セッションは(または)に正しく設定されてい1
ます。ページを更新すると、セッションはもう設定されていません。そうではないでしょうか?
そして、header
リダイレクトは明らかに何もしません。
更新 2
したがって、以下の@EmilFからの回答のおかげで、画面に印刷できるセッションIDが、echo session_id();
ページシフトまたはページ更新ごとに新しい乱数に見えることがわかりました。新しいセッションIDが別の場所を指しているため、セッションに保存されたデータが忘れられているように見えます。
以下を使用して:
<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...
cutckilc16fm3h66k1amrrls96
は単なる乱数であり、セッション ID は固定されており、保存されたデータはページの更新後に再度取得できるようになりました。これは非常にうまく機能します。まだ少し奇妙ですが、必要です。
これで、ヘッダーリダイレクトのみが機能する必要があります...
うーん、これは遮断された何かのようなにおいがします。セッションとヘッダーの機能が変更されました。おそらく、これはホストからの PHP 設定です。ヘッダー リクエストをブロックするもの。
つづく...
更新 3 - 解決済み
以下の私の答えを見てください。
ファイルを別のコーディング形式 (ANSI から UTF-8 など) に変更すると、ファイルの先頭に奇妙なシンボルが作成されます。作成されたシンボルは
で、自分のエディターでは表示できません。それらは php スクリプトの前にあるため、 と が適切に機能するのをheader
防ぎsession_start()
ます。なぜそれらが作成されたのか、私にはまだ謎があります。