0

セッション変数をヘッダー リダイレクト間で保持するにはどうすればよいですか?

私のヘッダーリダイレクトは次のようになります。header("Location:./content/user_dash.php");

私はsession_start();すべてのページの上部にあります。

ヘッダーリダイレクトの前に試しましたsession_regenerate_id(true);

ヘッダーの前と session_regenerate_id リダイレクトの後に試しましたsession_write_close();

ヘッダーのリダイレクトを試しましexit(0);た。die();

私が試してみましたheader("Location:./content/user_dash.php?PHPSESSID=".session_id());

エンドページを含めると機能し(ただし、これは使用できません)、リダイレクトするように変更すると、変数が機能しなくなります。$_SESSION を介した foreach ループでこれをテストしたところ、ページを含めると印刷されますが、リダイレクトされません。

リダイレクト後にセッション変数を使用する必要があるため、これについてはちょっと頭を悩ませています。

ファイル構造:

index.php = ログイン フォームを送信する => login_code.php = セッション変数を設定した後にリダイレクトする => user_dash.php 変数がエコーされ、何も表示されない (空の変数、設定されている場合にエコーする if ステートメント)

リダイレクトを削除しましたが、単純なハイパーリンクでさえ、セッション変数を次のページに運ぶことができません。

ライブ HTTP ヘッダー:

*serverinfo*/login_code.php

POST *serverinfo*/login_code.php HTTP/1.1
Host: server
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: *serverinfo*
Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=user&password=pass
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.10, ASP.NET
Date: Thu, 03 May 2012 16:24:54 GMT
Content-Length: 159
----------------------------------------------------------
*serverinfo*/content/admin_dash.php

GET *serverinfo*/content/admin_dash.php HTTP/1.1
Host: server
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3

HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.10, ASP.NET
Date: Thu, 03 May 2012 16:24:54 GMT
Content-Length: 3474
4

6 に答える 6

3

session_start()プレーンテキストを含む他のコードの前に置きます。

<?php session_start(); ?>
Hello<?php echo " ".$_SESSION['firstname']." ".$_SESSION['lastname'];?>.
于 2012-05-02T17:13:36.523 に答える
1

アプリケーションをデバッグする必要があります。

驚くかもしれませんが、プログラマーの時間のほとんどはデバッグに費やされます。それでは、実際のプログラマーの仕事について学びましょう。

header("Location:./content/user_dash.php?".session_name()."=".session_id());

と一緒に使用することsession_write_close()は、最も防弾的な方法です

それでも動作しない場合は、デバッグを開始してください。

  • セッションファイルを確認してください
  • クッキーを確認する
  • ini設定を確認する
  • user_dash.php のセッション ID を確認してください - 同じですか?
  • 本当にすべてのセッションが失われたのか、それとも変数が 1 つだけなのかを確認してください

ini設定ありがとうございます。不審物が2つ見える

  • session.use_only_cookies On は、URL 経由で SID を送信しても効果がないことを意味します。セッションCookieをもう一度確認してください
  • session.cache_expire 180 180 は小さすぎます。

私はあなたのアプリのデバッグのために支払われず、私自身の仕事があるので、いくつか見落としているかもしれません. したがって、すべての設定をデフォルトにして、自分が何をしているのかを確実に理解するまで、それらに触れないことをお勧めします

于 2012-05-02T19:34:40.117 に答える
0

$_SESSION 変数が設定されていても、セッション ID とともに Cookie に保存されていない問題の一部が見つかりました。その特定の問題に関する新しい質問を投稿します。

于 2012-05-03T16:55:46.823 に答える
-1

この特定の問題について少し読んだ後、bugs.php.netで、これについて多くの議論が行われていることに気付きました。

この特定の問題に関する議論の 1 つで見つかった解決策は、META Refresh を使用してユーザーをリダイレクトすることでした。

<meta http-equiv="refresh" content="0; url=http://example.com/">

引用:

PHP が以前に設定されたセッション変数を「見つける」ことができるようにするには、クライアントを識別できなければなりませんよね? これを達成するために使用されるデフォルトの方法は、セッションの開始時に設定された Cookie を使用することです。セッションが開始された同じページの Location ヘッダーを使用してユーザーをメンバー専用ページにリダイレクトしているように見えるため、PHPSESSID Cookie は設定されません。したがって、ユーザーがメンバー専用ページに到達すると、PHP はユーザーを識別できなくなります。彼らのセッション変数はまだそこにありますが、PHP は見知らぬ人にそれを与えません。:)

基本的に、Set-Cookie ヘッダーを含む HTTP 応答では、プロトコル レベルのリダイレクトではなく、通常の 200 OK 応答である必要があります。ここで意図した動作を絶対に行う必要がある場合は、リダイレクトにメタ リフレッシュを使用する必要があります。はい、それほどクールではありませんが、同じ応答で Cookie を設定してクライアントをリダイレクトする唯一の方法です。それ以外の場合は、URL で Cookie の値を渡す必要があります。これは、実際には適切なオプションである可能性があります。

于 2012-05-02T20:08:36.900 に答える
-1

リダイレクトと header() + refresh / location を処理すると、使用される PHP 構造に応じて、session_id が更新される場合があります。

経験上、session_name によって session_id の更新が妨げられるため、セッションに名前を付けると値に対処するのに役立つことがわかりました。


それについて読む: http://pt2.php.net/session_name


何よりも先に PHP

// If session is not set, this will set it up with the defined name.
// Session is then initialized.
define("CONF_SESSION_NAME", 'my_session_named');
if (!isset($_SESSION)) {
    session_name(CONF_SESSION_NAME);
    session_start();
}

私の経験では、これは同じ場所にある複数のプラットフォームからのセッションの衝突を回避し、header() の問題を回避するのに役立ちました。

于 2012-05-02T17:46:58.973 に答える