dポイントプレゼントキャンペーン実施中!

お世話になります。

現在.htaacessでパラメータをRewriteしてアドレスをスッキリさせています。

【htaccess】
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([-0-9A-Za-z]+)/([-0-9A-Za-z)]+)$ index.php?a=$1&b=$2 [L]

www.sample.com?a=test1&b=test2

www.sample.com/test1/test2
といった形にしています。

SESSIONのパスが現在「/」となっており、どのページでセッションを発行しても「www.sample.com」以下ならすべて有効になっているのですが、これをその階層以下でしか使えないようにする方法はありますでしょうか?

【例】
www.sample.com/test1/aaaa で発行したセッションはその階層(test1)以下でのみ有効としたい。
www.sample.com/test1/aaaa 、www.sample.com/test1/bbbb で開いたセッションは1つ目の階層(test1)以下どのページでも有効にしたい


実際に「test1」フォルダが存在するわけではないため、htaccessを設置することができず、また「test1」の階層名も様々であるため困っています。

どうぞよろしくおねがいいたします。

A 回答 (5件)

連投失礼します。

「セッション名」を変更するという方法も考えられそうです。どちらかと言えばこちらの方が扱いやすいかも…

session_name
http://php.net/manual/ja/function.session-name.php

で、OKWaveで検索してみたら案の定、既に質問がありました。

【PHP】SESSION変数の競合を避ける方法は?
http://oshiete.goo.ne.jp/qa/4139810.html

このケースでは test1 をそのままセッション名にすればいいと思います。半角英数字しか使えないことには注意してください。
    • good
    • 0

なるほど、上書きですか…



・session_set_cookie_params
・session_save_path

これらを同じように両方制御する必要がありそうですね。最初の回答はあながち誤りでは無かったかも・・・
    • good
    • 0

session_set_cookie_paramsの誤りでした、すみません。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

早速試してみまして、

$a = isset($_GET['a']) ? htmlspecialchars($_GET['a']) : "";
$b = isset($_GET['b']) ? htmlspecialchars($_GET['b']) : "";

にてアドレスの階層名を取得し、

session_set_cookie_params(0, '/'.$a.'/');

をsessin_start()の前に記述し、ブラウザで「http://sample.com/aaa/bbb」を叩いたところPHPSESSIDの値が「path:/aaa/」の名前できちんととることができました。

しかし次は「http://sample.com/bbb/ccc」として叩いたところ、上書きされてしまったみたいで、「aaa」で取得したPHPSESSIDが消えてしまいました…。

これをいずれも残す方法はありませんでしょうか?

ショッピングサイトを作っており、「aaa」の部分にショップ名が入り各階層ごとにショッピングカートの内容を保持したいと考えています。

上記の場合、カート内が混合することはないもののaaaのお店に行ったあとbbbのお店に行き、再度aaaのお店に戻ってきた時カートが空になってしまう問題がでてしまうかと思います(;_;)

どうぞよろしくおねがいいたします。

お礼日時:2014/01/20 00:46

session の仕組みとしてcookieを使う場合、有るページからsession cookie をブラウザに送ると、ブラウザ側では、その時の付帯情報として付いてきたcookie_path 設定に基づき、現在のパス階層で有効なcookieのみを次のリクエスト時に送信しています。

なので、上位階層のパスのページにリンクで飛ぶと、下位階層で設定したセッション情報がブラウザから送信されずにセッション切れを起こしたりします。
path_info を利用する場合、階層によらずに統一したいので、cookie_path を / に設定することが多いですけど、パスごとに個別制限したいときは、これを設定します。
php では、セッション用ならphp.iniの session.cookie_path を設定することになります。
ページのpath_infoによって変更するなら、ページのパスを$_SERVER["REQUEST_URI"]や$_SERVER["PATH_INFO"]などで判定したうえで、以下の関数で設定してから session_start() します。これをindex.phpのトップで行えば良いと思います。
session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
http://jp.php.net/manual/ja/function.session-set …
    • good
    • 0

要はindex.phpがフロントコントローラである、ということですよね。

ならばそこで session_save_path 関数による分岐を行ってみてはどうでしょうか?但し毎回 session_start 関数より前に実行しなければならないことに注意してください。

PHP Manual - session_save_path
http://www.php.net/manual/ja/function.session-sa …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!