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


132

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

最近、リダイレクト後にセッションが失われるという非常に一般的な問題が発生しました。そして、このWebサイトを検索した後も、解決策は見つかりません(ただし、これが最も近くなりました)。

更新

私は答えを見つけたので、同じ問題を経験している人を助けるためにここに投稿したいと思いました。


1
問題は、PHPでリダイレクト後にセッションが失われる問題を解決する方法です。私はすでに答えを見つけました。他の人に知らせるためにここに投稿するだけです。私のソリューションはStackOverflowにないからです。
Dayuloli

2
それは結構ですが、これはQAサイトです。あなたの質問を質問にしてください。
ジェレミー2013年

君からだとは知らなかった。それでも、このサイトは質問用であり、あなたがすでに知っている質問への回答用ではありません。
アリス2013年


21
@Aris事実ではありません。コーディングについて質問がある場合、彼らはStackOverflowに助けを求めてきます。利用できる答えがない場合、彼らは彼らが必要とする助けを得ることができません。私はその答えを提供しようとしています。
dayuloli 2013年

回答:


208

最初に、次の通常のチェックを実行します。

  1. session_start();セッションが呼び出される前に必ず呼び出されます。したがって、安全な賭けは、<?php何よりも前に開始宣言の直後に、ページの先頭に置くことです。また、開く前に空白やタブがないことを確認してください<?php宣言の。
  2. headerリダイレクト後、現在のスクリプトを使用して終了しますexit();(他の人も提案してsession_write_close();おりsession_regenerate_id(true)、あなたもそれらを試すことができますが、私は使用しますexit();
  3. テストに使用しているブラウザでCookieが有効になっていることを確認してください。
  4. 確認register_globalsあなたが上でこれを確認することができ、オフになっているphp.iniファイルも使用しましたphpinfo()。オフにする方法については、こちらを参照しください。
  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();

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

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

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


8
非常によく書かれた+1、すべてが失敗した場合は、Cookieを使用します(ランダムに文字列を生成してデータベースに保存し、それをCookieの値として使用します)。
Dave Chen

2
HTTP、HTTPSそしてnを切り替えることも問題のあることかもしれないstackoverflow.com/questions/441496/...
dev.e.loper

4
PHP

2
Webサーバーのエラーログも確認してください。私の場合、「セッションデータ(ファイル)の書き込みに失敗しました。session.save_pathの現在の設定が正しいことを確認してください」というエラーが発生しました。save_pathディレクトリの権限が間違っていました。
timbonicus

セッションがsession.save_path以外の場所に保存される理由は何ですか?
ジャスティン

26

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

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

Gecko(例:Waterfox、Firefox、SeaMonkey)にはバグがあり、データ出力(例echo ' ';:)またはあらゆる種類の空白がある場合、場所ヘッダーは完全に無視されます。
John

18

私はすべての可能な解決策を試しましたが、どれもうまくいきませんでした!もちろん、共有ホスティングサービスを使用しています。

最後に、リダイレクトヘッダー内で「相対URL」を使用して問題を回避しました。

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

セッションCookieを無効化

header("location: index.php")

魅力のように働いた!


7

同じ問題がありました。私はそれを数時間作業しました、そしてそれは私を夢中にさせました。

私の場合、問題はChromeとFirefoxでのみfavicon.icoないために呼び出された404 でした。他のナビゲーターはうまくいきました。


この回答に感謝したいのですが、画像に対する404リクエストがVarnishからCookieなしでPHPに転送され、新しいセッションが常に作成されていることを実感しました。あなたなしではそれを理解できなかったかもしれません。
Pascal Zajac 2017年

同じ問題があり、favicon.icoがリダイレクトされていたため(302サブドメインからメインドメインへのリダイレクト)、毎回新しいセッションが生成されていました。どうもありがとう!
simdrouin

4

相対パス「dir / file.php」をheader()関数で使用すると、うまくいきます。完全な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")

3

これは長い間私を困らせました(そしてこの投稿は素晴らしい発見でした!)しかし、ページリダイレクト間のセッションを機能させることがまだできない他の人にとっては... php.iniファイルに移動してcookieをオンにする必要がありました:

session.use_cookies = 1 

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


セッションがCookieなしで機能することを知りませんでした!毎日新しいことを学びましょう!programmerinterview.com/index.php/php-questions/...
dayuloli

もちろん、Cookieがなくても機能するかどうかは、構成によって異なります。しかし、あなたはあなたが何をすべきかを知っているべきです。そして、そうすることには十分な理由があります。安全性が低いためです。そして、あなたがクッキーなしで今までにない理由で働く必要がある場合に備えて。少なくともini_set( 'session.use_strict_mode'、 '1');を設定する必要があります。また、一般にセッション時間が短く、ユーザーのログイン後にsession_regenerate_id()を使用します。ただし、ユーザーがサーバー上のサイトへのリンクをフォーラムに投稿すると、このリンクをクリックしたユーザーがセッションを引き継ぐことになるので注意してください。多分IPをチェックすることも良い考えです。
マイケル

3

状況は少し異なりましたが、同様の問題がありました。ホスト名windowsとIPアドレスがであるマシンでローカル開発セットアップを行いました192.168.56.2

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

ログイン後、私のPHPコードは以下を使用してリダイレクトします。

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

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

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

ユーザーが入力したローカルドメイン名またはIPアドレスに関係なく機能するようになりました。

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


3

特定のページでこの問題に遭遇しました。リダイレクトの直前に他のページで$ _SESSION値を設定していたところ、すべてが正常に機能していました。しかし、この特定のページは機能していませんでした。

最後に、この特定のページでは、ページの先頭でセッションを破棄していたが、再度開始していないことに気付きました。だから私の破壊関数はから変更されました:

function sessionKill(){

    session_destroy();

}

に:

function sessionKill(){

    session_destroy();
    session_start();

}

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


3

私も同じ問題を抱えていました。セッション変数の突然の一部がすべて次のページに保持されません。(php7.1では)ヘッダーの場所にWWWを含めないでください(例:https:// mysite)。大丈夫です、https://www.mysite。そのページのセッション変数は失われます。すべてではなく、そのページだけです。


これwww.mysite.comは、とはまったく異なる、blog.mysite.comまたは単純にドメインと見なされているためですmysite.com
dayuloli

2

私は何日もこれに苦労して、すべての解決策をチェック/試行してきましたが、私の問題はsession_start();、リダイレクト後に再び電話をしなかったことでした。セッションは「まだ生きている」と思いました。

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


はい!これも私の問題でした。PHPセッションの開始は、家全体の照明をつけるようなものだと思いました。あなたが入る部屋ごとにスイッチを回さなければならないことに気づきませんでした。
デールトンプソン

1

私は同じ問題を抱えており、最も簡単な方法を見つけました。私はJSの1行でリダイレクト.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

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

$secureparamが真の手段中のセッションは、セキュアなリクエスト内でのみ使用可能です。これは、ステージ環境や実稼働環境よりもローカルで影響を受ける可能性があります。

今日のほとんどをこの問題を見つけるために費やしたので、それを言及しました、そしてこれが私のためにそれを解決したものです。私はこのプロジェクトに追加されたばかりで、httpsが必要であると誰も述べていません。

したがって、ローカルでhttpsを使用するか、$secureparamをに設定してFALSEローカルでhttpを使用することができます。変更をプッシュする場合は、必ずtrueに戻してください。

ローカルサーバーによっては、サーバーので編集DocumentRoothttpd-ssl.confて、ローカルURLがhttpsで提供されるようにする必要があります。


1

別の考えられる理由:

それが私のサーバーストレージスペースです。サーバーのディスク容量がいっぱいになりました。そのため、サーバーからいくつかのファイルとフォルダーを削除して試してみました。

効きました!

セッションをAWS Dynamo DBに保存していますが、サーバーの一部のスペースがセッションを処理することを期待しています。なぜだかわかりません!!!


1

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

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

0

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

ヘッダーリダイレクトを別の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

私にとってのエラーは、セッションでシリアライズ不可能なオブジェクトを保存しようとしたため、セッションを書き込もうとしたときに例外がスローされたことでした。しかし、すべてのエラー処理コードがすでに操作を停止しているため、エラーを見ることはありませんでした。

ただし、Apacheエラーログで確認できます。


0

記録のために...私はこの問題を抱えていて、数時間試行した後の問題は、ディスクがいっぱいで、phpセッションがtmpディレクトリに書き込めなかったことでした...この問題がある場合は、も...


この答えは私にとってうまくいきました。nginxでAmazon Machine Imageを実行します。セッションフォルダーが正しいユーザー(私たちの場合www)によって所有されていないという障害があるようです。そのため、セッションフォルダーで実行chown -R www.wwwすると問題が解決します。
Joshua

0

私の場合、FirefoxはセッションID(PHPSESSID)をCookieに保存していますが、Google ChromeはGETまたはPOSTパラメータを使用しています。そのため、返されたスクリプト(私にとってはpaypalチェックアウト)がPHPSESSIDをurlまたはPOSTパラメーターでコミットすることを確認するだけで済みます。


0

ここSOや他のブログで多くの解決策を試した後、私にとってうまくいったのは、.htaccessを私のWebサイトのルートに追加することでした。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]

0

Wordpressを使用している場合は、このフックを追加して、initでセッションを開始する必要がありました。

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

0

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

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

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


0

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

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

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

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

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

  2. セッションディレクトリは書き込みできない可能性があります。あなたはそれをチェックすることができますis_writable(session_save_path())


0

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

したがって、誰かがこれを読んだ場合は、php.ini何よりもまずconfig を確認してください。


0

セッションを設定するときと設定するときにsession_write_close呼び出されないようにしてsession_start()ください。

session_start();

[...]

session_write_close();

[...]

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

0

GDPRが登場した今、この質問にアクセスする人はおそらくcookieスクリプトを使用しています。あのスクリプトが原因で問題が発生しました。どうやら、PHPはと呼ばれるクッキーを使用していますPHPSESSIDセッションを追跡するためにます。そのスクリプトがそれを削除すると、データが失われます。

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

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


0

何日ものデバッグの後でこの問題を修正しましたが、それはすべて、PayPal Express Checkoutからの戻りURLに「www」がなかったためです。Chromeはドメインを同じように処理する必要があることを認識しましたが、他のブラウザーでは処理されない場合がありました。セッション/クッキーと絶対パスを使用するときは、「www」を忘れないでください!


0

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


0

今日、私はプロジェクトにこの問題があり、このパラメーターをfalseに変更する必要がありました(または行を削除しました。デフォルトでは無効になっています)。

ini_set( 'session.cookie_secure', 1 );

これは、実際のプロジェクトがhttpsではなくhttpでのみ機能するために発生しました。詳細については、ドキュメントhttp://php.net/manual/en/session.security.ini.phpをご覧ください。


0
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

返信するには遅すぎますが、これでうまくいきました


0

私にとってこれは許可エラーであり、これはそれを解決しました:

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

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

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

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

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

これが誰かを助けることを願っています。


1
chownは、パッケージの更新時にデフォルト値に戻されるため、BADソリューションです。デフォルトのプール構成(www.conf)のコメントを参照してください。Apache以外のディレクトリを使用する場合の適切な方法(例:/ var / lib / php / nginx / session)
Remi Collet

あなたが正しいです。そもそもパッケージのアップデートが私の問題の理由でした。しかし、それはそれが行われた方法であり、私はこれが役立つ簡単な解決策を必要としていたからです。私のSYS管理者が問題を解決しました。私はLinuxにあまり慣れていません。
テモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.