0

私はこの問題をたくさん検索したと言いたいです。それを解決しようとして1週間以上経った後、私はほとんどそこにいると思います.

はい、私は session_start() を置きます - 私は session.auto_start をオンにしているので、これだけではありません!

一部の訪問者は、www を使用せずに私のサイトにアクセスし、他の訪問者は使用します。訪問中にドメインの変更が発生する可能性があるため (mydomain.com から www.mydomain.com へ、またはその逆)、$_SESSION データが失われ、多くのエラーが発生します。

だから私は私のコードにこれを追加します:

session_write_close(session_id());
ini_set('session.cookie_domain', '.mydomain.com');
session_set_cookie_params(0, '/', '.mydomain.com');
session_start();

いくつかのテストの後、Chrome と Firefox で完全に動作するようになりました。ドメインを変更しても、セッション ID とデータは同じままです。しかし、驚くことではありませんが、IE では動作しません。

理論的には、PHP はブラウザーを動かしていないので、私には手がかりがありません。したがって、ユーザーエージェントが何であれ、それは機能するはずです。

IE では、セッションから別のセッションに変更されます。とても奇妙です。何が起こるかは次のとおりです。

  1. mydomain.com/info1 にアクセスすると、多くのデータが $_SESSION に読み込まれます。
  2. mydomain.com/info2 にアクセスすると、新しいデータに応じて $_SESSION が上書きされます。ここまでは、すべてが完璧です。
  3. しかし、ランダムに、IE でのみ、/info1 に関する情報が表示され、突然、/info2 に戻ることがあります。

フレームセットを使用しているので、これはphp.netからの重要なメモだと思います:

通常、セッション データは、session_write_close() を呼び出す必要なくスクリプトが終了した後に保存されますが、同時書き込みを防ぐためにセッション データがロックされているため、一度に 1 つのスクリプトしかセッションで操作できません。フレームセットをセッションと一緒に使用すると、このロックにより、フレームが 1 つずつ読み込まれます。セッション変数へのすべての変更が完了したらすぐにセッションを終了することで、すべてのフレームをロードするのに必要な時間を短縮できます。

フレームセットなしで新しいテストを行ったところ、IE を含むすべてのブラウザで動作しました。

セッションのphp構成は次のとおりです。

Directive   Local Value Master Value
session.auto_start  On  On
session.bug_compat_42   On  On
session.bug_compat_warn On  On
session.cache_expire    240 240
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  100 100
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 4   4
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /tmp    /tmp
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    Off Off
session.use_trans_sid   0   0
4

1 に答える 1

1

一部の訪問者は、www を使用せずに私のサイトにアクセスし、他の訪問者は使用します。訪問中にドメインの変更が発生する可能性があるため (mydomain.com から www.mydomain.com へ、またはその逆)、$_SESSION データが失われ、多くのエラーが発生します。

これは単なる提案です。わかりませんが、おそらく役立つでしょう。アクセスできる場合にここでできることは.htacces、Web サイトへのアクセス方法、特にMod_Rewriteの助けを借りてwwwの有無にかかわらずドメイン部分を正規化することです。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

www.この例では、ユーザーが混合ではなく、常にサブドメインを使用して Web サイトを使用することを保証します。

これも一般的には良いことで、サイトのドメインが 1 つしかないため、頭痛の種を減らすことができます。

于 2012-10-29T16:39:40.860 に答える