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"]:

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/07/18 17:39:06
  • 終了:2011/07/20 09:30:15

ベストアンサー

id:deep_one No.1

deep_one回答回数86ベストアンサー獲得回数62011/07/19 14:59:37

ポイント1000pt

コメントで指摘されていることが原因としては全てだと思われるのですが、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の値も確認するべきでしょう。

id:hhashimo

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

一応一通り確認しましたが、残念ながらドメインは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, バーチャルホストのパス);

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

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

ありがとうざいました。

2011/07/20 09:27:01

その他の回答(1件)

id:deep_one No.1

deep_one回答回数86ベストアンサー獲得回数62011/07/19 14:59:37ここでベストアンサー

ポイント1000pt

コメントで指摘されていることが原因としては全てだと思われるのですが、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の値も確認するべきでしょう。

id:hhashimo

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

一応一通り確認しましたが、残念ながらドメインは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, バーチャルホストのパス);

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

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

ありがとうざいました。

2011/07/20 09:27:01
id:qweertyuiop No.2

ジュードマテイス回答回数10ベストアンサー獲得回数02011/07/19 19:21:18

ポイント10pt

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

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

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

id:hhashimo

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

2011/07/19 19:25:15
  • id:hhashimo
    補足です。

    セッションは共にDBではなくファイルに保存する設定になっています。

    試験環境は、本番用と同じサーバーのディレクトリにバーチャルホスト設定で、別ドメインを割り当てています。データベースも試験用の別のデータベースをあてています。

    サーバーはバーチャルドメインで分けてるだけですので、phpの設定は共有です。

    PHP.iniの設定を.htaccessで環境によって切り分けるというようなことはしていません。

    session.use_trans_sid はオフです。
  • id:hhashimo
    対処法も含めて、と書きましたが、ひとまず原因だけでも結構です。
  • id:a-kuma3
    回答できる自信は全くないのですが、ちょっと確認。

    本番用と試験用の環境の差についてですが、
    Webサーバは当然違うとして、クライアントは同じですよね?
    後、クライアントから Webサーバに至る経路は違ってますか?
    本番用は負荷分散装置を挟んでる、とか、試験用は、クライアントとサーバが同一筺体だとか。
  • id:hhashimo
    コメントありがとうございます。
    ウェブサーバもバーチャルドメインで分けてるだけですので同じです。クライアントも同じです。上のコメント欄の補足情報も併せてお読みください。
  • id:Lhankor_Mhy
    一応念のための質問です、気を悪くなさらないで下さいね。
    「phpによるソースが全く同じ」とのことですが、Cookieのドメインやパスは指定はしてないですよね?
  • id:a-kuma3
    そういえば、前の質問でも、ソースすら同じところを指していて、違うのはドメインの定義くらいだったのに、ということでしたね。

    んー、なんだかなあ…
  • id:hhashimo
    >一応念のための質問です、気を悪くなさらないで下さいね。
    > 「phpによるソースが全く同じ」とのことですが、Cookieのドメインやパスは指定はしてないですよね?

    コメントありがとうございます。
    ええと、すみません。Cookieのドメインやパスとはどういうものでしょうか?
    設定ファイル上ではセッションをファイルに保存する設定(TrueあるいはFalseで指定)になっているので、どこかでパス等も指定しているのかもしれませんが、それらしきソースは見当たりませんでした。

    事象としては、試験用だけ、$HTTP_GET_VARSにセッションIDがついているので、試験用の時だけクライアント側がクッキーに対応できなくなっているようなのですが、何故このようなことになるのかわかりません。
  • id:hhashimo
    なお、セッションとは無関係の通常のクッキーは試験用でも正常動作が確認できています。セッションクッキーだけ異常があります。
    ファイルの中身を見たいところですが、セッションクッキーは通常場所すらわからないそうで・・・。
  • id:Lhankor_Mhy
    http://www.php.net/manual/ja/function.session-set-cookie-params.php
    http://www.php.net/manual/ja/session.configuration.php#ini.session.cookie-domain
    ↑こういったもので設定します。デフォルトでは設定がないはずなので、フレームワークなどで初期設定がされていない限り大丈夫だとは思うのですが……
     
    ご存知とは思いますが、CookieにはSame-Originポリシーというものがありまして、別ドメインのCookieにはアクセスできません。本番環境に合わせてドメインの設定がされていればアクセス拒否されることになるはずです。……たぶん。
  • id:hhashimo
    コメントありがとうございます。
    session_set_cookie_params関数は確認できました。しかし、試験用も本番用もドメイン以下の同じパスを設定してるだけで、ドメインはいじっていないようです。
    感覚的には、このことから、各ドメインごとにセッションクッキーを作ってると思うのですが。。。

    しかし、かなり核心に迫って来た感はあります。
  • id:Lhankor_Mhy
    Set-Cookieヘッダがあるレスポンスが1回はあるはずですが、その時のヘッダ情報はどうなっていましたでしょうか?
  • id:Lhankor_Mhy
    あ、解決したんですね。おめでとうございます。
  • id:deep_one
    入力されたURLから実際の設定値を割り出すために元々のosCommerceが行っている処理が原因なのでしょうか。ずいぶんと複雑な所にはまり込んでいたようですね。変数やら定数やらが連鎖的に計算されていたりすると把握はとても面倒なものになりがちですね…

    若干でも参考になったのであれば幸いです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません