人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpによるソースが全く同じ(※)本番用と試験用の環境があるのですが、本番用ではセッションがセッションクッキーに保存されるが、試験用では保存されず困っております。

概要だけで結構ですので、どういう原因が考えられるか、その対処法も含めてアドバイスを頂けたら幸いです。ズバリ的中した方には800pt差し上げます。

なお、セッションをスタートした直後の変数は、以下のようになっています。
(osCsidはセッション名)

<本番用>
$HTTP_POST_VARS["osCsid"]:
$HTTP_GET_VARS["osCsid"]:
$_COOKIE["osCsid"]: 982c7870d48dcd16d1decaff158a5f0d
$HTTP_COOKIE_VARS["osCsid"]: 982c7870d48dcd16d1decaff158a5f0d


<試験用>
$HTTP_POST_VARS["osCsid"]:
$HTTP_GET_VARS["osCsid"]: c9c70a28ae08ef6e495cc33b1868dc58
$_COOKIE["osCsid"]:
$HTTP_COOKIE_VARS["osCsid"]:

※ドメインとデータベースに関する部分だけは設定ファイルによって変更されています。
他、コメント欄にいくつか補足しますので、ご回答前にコメント欄もご覧ください

●質問者: hhashimo
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP アドバイス クッキー コメント欄 スタート
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● deep_one
●1000ポイント ベストアンサー

コメントで指摘されていることが原因としては全てだと思われるのですが、GETでセッションIDがきている理由が気にかかった点を調べたので回答を作成します。



まず、本番用サイトのアドレスをhoo.jpとすると、プログラムのどこかに「hoo.jp」という文字列が書き込まれていないかどうかが問題です。コメントにあるとおり、その文字列(もしくはその文字列に展開される変数か定数)がsession_set_cookie_params関数やsetcookie関数で使用されているのなら、ブラウザーからのクッキーを受け取ることが出来ないのでドメインを変えると動作しません。ドメインを変えて運用するにはプログラムの一部を書きかえる必要があります。(コメントにあるとおり、違うドメインのクッキーは通常内容が分からないからです。)また、設定によっては「特定のパスより下」になっていなければクッキーが送信されない場合もあります。



session.use_trans_sidはオフとのことなので、GETでセッションIDとおぼしきものが送られてきているのを奇異に感じましたが、おそらくプログラム内で定数SIDを使用したクッキー無効時の対応策が講じられているのではないかと思われます。

http://www.php.net/manual/ja/session.idpassing.php



対応策としては、「PHPのプログラムファイルを検索してsession_set_cookie_paramsやsetcookieという文字列を探して、それに続く部分に本番用ドメイン名が書かれていないか探す」ということになります。ドメイン名が書かれているようなら、テスト用の方ではその部分をテスト用ドメイン名に書きかえて下さい。設置するパスが違うようなら、その部分も確認する必要がありますが、それについてはむしろ「同じパスに置く」ことにした方が簡単でしょう。

ドメイン名が直接書かれているように見えない場合、session_set_cookie_paramsの三番目、setcookieの五番目の引数(ドメインを指定する部分)が変数か定数になっていないかを確認します。そうであった場合、その変数か定数の値がなんであるかを更に検索して探さなければなりません。セッションクッキーの問題についてはその部分を直接書きかえるだけで解決しますが、その変数なり定数なりがプログラム内で広く利用されている場合、その宣言部分を書きかえなければプログラムが正常動作しないことが考えられます。(変数名、定数名で検索して、どのくらい出現するのかを確認するとよいでしょう。)変数名になっている場合はどこで書きかえるべきか分かりにくいのですが、定数ならdefineという文で書かれているので、それを検索するとたいていは簡単に見つかります。



なお、ドメインの指定を「空文字列("")」に書きかえれば「今のドメイン」を指すようになるはずです。



osCsidはosCommerceというGPLプログラムで使用されているセッション名と同じらしいのですが、もしご質問のシステムがそれに該当する場合、以下のページが参考になります。

http://www.bitscope.co.jp/tep/setup2.1/setup.html#id_23_

application_top.phpで定数HTTP_SERVERにサイトのURLを設定することになっているので、この定数をテストサイト用に書きかえる必要があります。おそらく、HTTPS_SERVERの値も確認するべきでしょう。

◎質問者からの返答

かなりじっくりとご回答下さってありがとうございます。

一応一通り確認しましたが、残念ながらドメインはrequireによって環境ごとに切り替わるようになっていますので、ソース本体にはドメインの記述がありません。

session_set_cookie_params関数を確認しましたが、こちらもライフタイムとドメイン以下の共通のパスが指定されているだけで、ドメインを示すパラメータはセットされていませんでした。(第三引き数以下は省略されている)

session.use_trans_sidとSIDについてはまさしくその通りです。

お察しの通り、当該ソースはosCommerceを改造したものです。

HTTP_SERVER 及び HTTPS_SERVERも環境ごとに別途requireで読み込まれて定義されてますので、既に切り替わっています。

ここまでを総合すると、バーチャルドメインでドメインを分けている関係で、セッションの処理の過程でバーチャルと本来のドメインの区別がつかなくなっているのではないか? という疑問を抱きました。

むしろsession_set_cookie_params関数でドメインを明示していないのが問題ではないか?と。

まだ試していませんが、これから試してみます。




加筆です。

ドメインを指定してもダメでした。。。。

後は、サーバー自体を変えて、バーチャルではなくて通常のドメインをあてること位しか思い浮かびません。あまり事例がないようですが、バーチャルドメインを使ってる人は少ないんですかね?


加筆?です。

session_save_pathという関数でセッションの保存先がわかり、試験環境のセッションがサーバーに保存されていることが確認できました。が、所詮クッキー無効のため毎回発行されてるSIDなんですよね。

となるとブラウザ側の問題??? 他のマシンでも確認できてるんですけどね。


この場を借りて訂正します。

バーチャルドメインと言ってましたが、正確にはバーチャルホストですね。



### 加筆?です。###

その後、別のサーバを借りて、試験環境のソースでテストしてみました。

結果は、本番環境と同じ動作となりました。

これで1つの解決策と、おぼろげながらもバーチャルホストが原因と判明しましたが、理想は現状のままバーチャルホストで試験環境を運用することです。

開発する上では望ましくないのでしょうが、現在のサーバは維持費が高く、ディスク容量にもかなり余裕があることから、そうしています。

あと一歩で完全解決できそうなので、さらなるご協力をお願いします。


### 加筆?です。###

ついに成功しました。

session_set_cookie_params関数で指定するパスは、HTTP_SERVER等で試験環境用のドメイン(バーチャルホスト)を指定したとしても、バーチャルホスト配下ではなく本来のホスト配下のパスと認識されるようで、これを、

session_set_cookie_params(0, バーチャルホストのパス);

とすることで解決しました。

ご回答で比重をおかれていた部分とは異なりましたが、ご回答にあった、"設定によっては「特定のパスより下」になっていなければクッキーが送信されない場合もあります。" が今回の原因だったと言える思います。

ありがとうざいました。


2 ● ジュードマテイス
●10ポイント

対応策としては、「PHPのプログラムファイルを検索してsession_set_cookie_paramsやsetcookieという文字列を探して、それに続く部分に本番用ドメイン名が書かれていないか探す」ということになります。ドメイン名が書かれているようなら、テスト用の方ではその部分をテスト用ドメイン名に書きかえて下さい。設置するパスが違うようなら、その部分も確認する必要がありますが、それについてはむしろ「同じパスに置く」ことにした方が簡単でしょう。

ドメイン名が直接書かれているように見えない場合、session_set_cookie_paramsの三番目、setcookieの五番目の引数(ドメインを指定する部分)が変数か定数になっていないかを確認します。そうであった場合、その変数か定数の値がなんであるかを更に検索して探さなければなりません。セッションクッキーの問題についてはその部分を直接書きかえるだけで解決しますが、その変数なり定数なりがプログラム内で広く利用されている場合、その宣言部分を書きかえなければプログラムが正常動作しないことが考えられます。(変数名、定数名で検索して、どのくらい出現するのかを

確認するとよいでしょう。)

◎質問者からの返答

申し訳ありませんが、No.1の方の回答を要約しただけのように見受けられます。既にNo.1の方で返答しましたので、ここでは省略させて頂きます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ