web-dev-qa-db-ja.com

リダイレクト後にPHPセッションが失われました

PHPでリダイレクト後にセッションを失う問題を解決するにはどうすればいいですか?

最近、リダイレクト後にセッションを失うという非常に一般的な問題に遭遇しました。そして、このウェブサイトを検索した後、私はまだ解決策を見つけることができません(しかし これ が一番近くに来ました)。

更新

私は答えを見つけました、そして私は私が私が同じ問題を経験している人を助けるためにそれをここに投稿することを考えていました。

115
dayuloli

まず、これらの通常のチェックを行います。

  1. セッションが呼び出される前にsession_start();が呼び出されることを確認してください。だから安全な賭けはそれをあなたのページの始めに、他の何かの前に開始<?php宣言の直後に置くことでしょう。また、開始<?php宣言の前に空白やタブがないことを確認してください。
  2. headerのリダイレクト後、exit();を使用して現在のスクリプトを終了します(他の人もsession_write_close();およびsession_regenerate_id(true)を提案していますが、それらを試すこともできますが、私はexit();を使用します)。
  3. テストに使用しているブラウザでcookieが有効になっていることを確認してください。
  4. register_globalsがオフになっていることを確認します。これはphp.iniファイルで、またphpinfo()を使用して確認できます。無効にする方法については this を参照してください。
  5. セッションを削除または空にしなかったことを確認してください
  6. $_SESSIONスーパーグローバル配列のキーがどこにも上書きされていないことを確認してください
  7. 必ず同じドメインにリダイレクトしてください。そのため、www.yourdomain.comからyourdomain.comにリダイレクトしてもセッションは進みません。
  8. あなたのファイル拡張子が.phpであることを確認してください(それは起こります!)

今、これらは最も一般的な間違いですが、それらがトリックをしなかった場合、問題はあなたのホスティング会社でする可能性が最も高いです。すべてがlocalhostで機能するが、リモート/テストサーバーでは機能しない場合は、これが原因と考えられます。それであなたのホスティングプロバイダーの知識ベースをチェックしてください(また彼らのフォーラムなどを試してみてください)。 FatCowやiPageのような会社では、session_save_pathを指定する必要があります。とてもこんな感じ:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(「ホームディレクトリのパス」を実際のホームディレクトリのパスに置き換えます。これは通常、コントロールパネル(または同等のもの)内にありますが、ルートディレクトリにtest.phpファイルを作成して次のように入力することもできます。

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

'test.php'の前のビットはあなたのホームディレクトリのパスです。そしてもちろん、フォルダが実際にあなたのルートディレクトリの中に存在することを確認してください。 (一部のプログラムは同期時に空のフォルダをアップロードしません)

179
dayuloli

あなたはheader-callの後に "exit"を使うべきです

header('Location: http://www.example.com/?blabla=blubb');
exit;
22
KraftART Berlin

考えられる解決策をすべて試しましたが、どれもうまくいきませんでした。もちろん、私は共有ホスティングサービスを利用しています。

結局、リダイレクトヘッダ内で 'relative url'を使用することで問題を回避できました。

header("location: http://example.com/index.php")

セッションクッキーを無効にした

header("location: index.php")

魅力のように働いた!

13
ali al-juanidi

私は同じ問題を抱えていました。私は数時間それに取り組みました、そしてそれは私を狂わせました。

私の場合、問題は404と、ChromeとFirefoxでmissing a favicon.icoが原因で呼び出されたことです。他のナビゲーターはうまくいきました。

5
Jeremie

私の文脈は少し異なっていたが、私は同様の問題を抱えていた。私は、ホスト名がwindows、IPアドレスが192.168.56.2のマシンでローカル開発設定をしました。

私は次のいずれかを使用してシステムにアクセスできました。

ログイン後、私のPHPコードは次のようにリダイレクトします。

header('http://windows/');

システムへのアクセスに使用されていた以前のドメイン名がwindowsではなかった場合、セッションデータは失われます。私はこれをコードを次のように変更することで解決しました

header('http://'.$_SERVER['HTTP_Host'].'/');

ユーザーがどのローカルドメイン名またはIPアドレスを入力したかにかかわらず動作するようになりました。

私はこれが誰かに役立つかもしれないと思います。

3

私は同じ問題を抱えていました。私のセッション変数の突然のいくつかが次のページに固執しないでしょう。問題は(php7.1で)あなたのヘッダ位置にはWWWがあってはいけませんでした、例 https:// mysite 。大丈夫です、 https://www.mysite 。そのページのセッション変数を失います。すべてではなく、そのページだけです。

3
Wynn

これは長い間私を困惑させました(そしてこの記事は見つけるのは素晴らしいことでした!)それでもまだページリダイレクトの間にセッションを実行することができない他の人のために...私はphp.iniファイルに入ってクッキーをオンにしなければなりませんでした:

session.use_cookies = 1 

私はセッションがクッキーなしでうまくいくと思っていました...実際、私はそれらがSHOULDであることを知っています...しかしこれは少なくとも全体像で何が起こっているのか理解できるまで私の問題を解決しました。

3
sclarky

私は1つの特定のページでこの問題に遭遇しました。リダイレクトする直前に他のページで$ _SESSION値を設定していましたが、すべてうまくいきました。しかし、この特定のページは機能していませんでした。

最後に、この特定のページでは、ページの始めにセッションを破棄していましたが、再開することはありませんでした。それで私のdestroy関数は次のように変わりました。

function sessionKill(){

    session_destroy();

}

に:

function sessionKill(){

    session_destroy();
    session_start();

}

そしてすべてがうまくいった!

3
NicB

session_set_cookie_params()を使用している場合は、4番目のパラメータ$securetrueとして渡しているかどうかを確認します。もしそうなら、httpsを使ってURLにアクセスする必要があります。

$secureパラメータがtrueであるということは、セッションが安全なリクエスト内でのみ利用可能であることを意味します。これは舞台環境や本番環境よりもローカルにあなたに影響を与えるかもしれません。

今日のほとんどの時間をこの問題の発見に費やしたので、それについて言及してください、そしてこれは私にとってそれを解決したものです。私はこのプロジェクトに追加されたばかりで、httpsが必要だとは誰も言わなかった。

そのため、ローカルでhttpsを使用するか、$secureパラメータをFALSEに設定してからローカルでhttpを使用することができます。変更をプッシュアップするときは、必ずtrueに戻してください。

ローカルサーバーによっては、ローカルURLがhttpsで配信されるように、サーバーのhttpd-ssl.conf内のDocumentRootを編集する必要があります。

1
Andy Huggins

もう一つの考えられる理由:

それが私のサーバーの記憶域です。サーバーのディスク容量がいっぱいになりました。だから、私は私のサーバー内のいくつかのファイルやフォルダを削除してみました。

うまくいった!

セッションをAWS Dynamo DBに保存していますが、セッションを処理するためにサーバー内のスペースが必要です。理由がわからない!

1
Jayaprakash

私は何日もの間この問題に取り組み、すべての解決策を調べてみましたが、私の問題はリダイレクト後に再びsession_start();を呼び出さなかったことです。セッションは「まだ生きている」と思いました。

それを忘れないでください。

1

私は同じ問題を抱えていて、最も簡単な方法を見つけました。私は単純に1行のJSでリダイレクトの.htmlにリダイレクトしました

<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>

pHPの代わりに

header_remove();
header('Location: admin_login.php');
die;

これが役に立つことを願っています。

ラブグラム

1
Gramrock

$_SESSION変数を使用する前に、まずsession_start()を呼び出していることを確認してください。

エラー報告を無効にした場合は、有効にして結果を確認してください。

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

@ dayuloliの回答に記載されていない最も一般的な理由:

  1. ディスク容量の問題ディスク容量が一杯になっていないことを確認してください。セッションファイルを保存するためのスペースが必要です。

  2. セッションディレクトリは書き込み可能ではないかもしれません。 is_writable(session_save_path())で確認できます

0
F0G

私にとって迅速で実用的なソリューションは、単に二重リダイレクトでした。 fb-go.phpfb-redirect.phpの2つのファイルを作成しました

fb-go.phpは次のようになりました。

session_start();

$_SESSION['FBRLH_state'] = 'some_unique_string_for_each_call';

header('Location: fb-redirect.php');

およびfb-redirect:

session_start();

header('Location: FULL_facebook_url_with_' . $_SESSION['FBRLH_state'] . '_value');

言及する価値があるのは、Android Chromeブラウザーの動作です。ユーザーがそのようなものを見ることができる場所:

Android

ユーザーがFacebookアプリを選択すると、ユーザーセッションデータを保存しているChromeではなくFacebookブラウザーで開くため、セッションが失われます。

0
instead

私の場合、FirefoxはセッションID(PHPSESSID)をCookieに格納していますが、Google ChromeはGETまたはPOSTパラメータを使用しています。つまり、返されるスクリプト(私の場合はPaypalチェックアウト)がURLのPHPSESSIDまたはPOSTパラメータを必ずコミットするようにする必要があります。

0
almisoft

今日、私はプロジェクトでこの問題を抱えていました、そして私はこのパラメータをfalseに変更しなければなりませんでした(またはデフォルトで無効になっている行を削除します):

ini_set( 'session.cookie_secure', 1 );

これは実際のプロジェクトがhttpではなくhttpsのみで動作するために起こりました。ドキュメントでより多くの情報を見つけました http://php.net/manual/en/session.security.ini.php

0
Oscar

OPは、同じページにリダイレクトするかどうか(ログイン後など)を指定しませんでした。サーバー/ブラウザのキャッシュも問題になる可能性がある場合

簡単な回避策は、URLの最後にバージョン番号を追加することです(.CSSファイルの更新を強制する場合と同様)。

例:

header('Location: index.php?v='.time());

そのため、ユーザーはリダイレクトされ、新しいページのように扱われます

domain.com/index.php?v=122234982323
0
Robert Sinclair

SOや他のブログでここで多くの解決策を試した後...私のために働いたのは私のウェブサイトのルートに.htaccessを追加することでした。

RewriteEngine on
RewriteCond %{HTTP_Host} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
0
Vishal Kumar
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

返信が遅すぎますが、これは私のために働きました

0
ViperTecPro

何も私にはうまくいきませんでしたが、私は問題を引き起こしたもの(そしてそれを解決したもの)を見つけました:

ブラウザのクッキーをチェックし、異なるサブドメインのphpセッションクッキー( "www.website.com"用、 "用)などがないことを確認してください( website.com ")。

これは、Cookieを設定し、iframeでページを開くためにサブドメインを誤って使用していたJavaScriptが原因でした。

0
Julius S.

私にはこれはパーミッションエラーであり、これはそれを解決しました:

chown -R nginx:nginx/var/opt/remi/php73/lib/php/session

私はPHPで数時間テストしました、そして私がした最後のテストは私が2つのファイルsession1.phpとsession2.phpを作成することでした。

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

そしてそれは空の配列を出力していました。

現時点で、私はそれがサーバーの問題である可能性があると思いました、そして実際に、それはそうでした。

これが誰かに役立つことを願っています。

0
temo

session_start()とセッションの設定時の間にsession_write_closeが呼び出されないようにしてください。

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save
0
Jordan Daigle

PHPがセッションファイルを保存するパスへのグループ書き込み権限を与えることで修正しました。 session_save_path()関数でセッションパスを見つけることができます。

0
franzisk

私にとってのエラーは、セッションを書き込もうとしている間に例外が投げられるように、セッション内でシリアル化できないオブジェクトを保存しようとしたことです。しかし、私のエラー処理コードはすべて操作を中止しているので、私はエラーを見たことがありません。

しかし、私はそれをApacheのエラーログで見つけることができました。

0
Björn Tantau

Header()関数で相対パス「dir/file.php」を使用すると、私のために動作します。完全なURLを使用してリダイレクトすると、何らかの理由でセッションが保存されないと思う...

//Does retain the session info for some reason
header("Location: dir");

//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
0
user2999967

私は何日ものデバッグの後にこの問題を修正しました、そしてそれはすべてPaypal Express Checkoutから来る私のリターンURLが 'www'を持っていなかったことのすべてでした。 Chromeはドメインは同じように扱われるべきだが他のブラウザは時々そうではないことを認識していました。セッション/クッキーと絶対パスを使うときは、「www」を忘れないでください。

0
miapuffia

GDPRが問題になった今、この質問に訪れる人々はおそらくクッキースクリプトを使うでしょう。ええと、そのスクリプトは私のために問題を引き起こしました。どうやらPHPはセッションを追跡するためにPHPSESSIDと呼ばれるクッキーを使います。そのスクリプトがそれを削除すると、あなたはデータを失います。

私は このクッキースクリプト を使用しました。 「必須」Cookieを有効にするオプションがあります。私はリストにPHPSESSIDを追加しました、スクリプトはクッキーを削除するのを止めました、そして、すべては再び働き始めました。

おそらくPHP設定を有効にしてPHPSESSIDを使用しないようにすることもできますが、Cookieスクリプトが問題の原因である場合は、を修正しないでください.

0
Hristiyan Dodov

Laravelを使用していてこの問題が発生した場合は、リダイレクトする前にセッションデータを保存する必要があります。

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
0
Aubrey Kodar

私もリダイレクトが機能していないと同じ問題を抱えていたし、私が見つけることができるすべての解決策を試してみました、私のヘッダーのリダイレクトがフォームで使用されていました。

私はそれを別のphpページ 'signin_action.php'にリダイレクトして変数パラメータをURLパラメータに渡してから 'signin_action.php'形式で再割り当てすることで解決しました。

signin.php

if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);

signin_action.php

<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {

echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}

?>

これは美しい回避策ではありませんが、うまくいきました。

0
Stacker-flow

ただ記録のために...私はこの問題を抱えていました、そしてすべての問題を試みた数時間後の問題はディスクがいっぱいで、phpセッションがtmpディレクトリに書き込めなかったということでした。も….

0
iperich

私は同じ問題を抱えていたので、私は自分のコードで答えを探していました。最後に、私のホスティングが最近私のサーバー上のPHPバージョンを更新し、session_save_pathファイルのphp.iniパラメータを正しく設定していないことがわかりました。

ですから、誰かがこれを読んだ場合は、何よりもphp.ini configをチェックしてください。

0
Yova Turnes

あなたがWordpressを使っているなら、私はこのフックを追加してinitでセッションを開始しなければなりませんでした:

function register_my_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'register_my_session');
0
Jack Nicholson