質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

クッキーの動きがディレクトリによって異なる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 299

chapp

score 176

お世話になります。昨日からCOOKIEの取り扱いについて試行錯誤を繰り返していますが(今日も一日中自宅にこもりPCの前にずっといた)、疑問ばかりが残り、アドバイスいただければと質問いたします。

昨日、同じくCOOKIEのことで質問したのですが、
https://teratail.com/questions/145593
現状、改めて説明させていただくと、下記のようなスクリプトをウェブページに設置し、アクセス履歴をクッキーに保存し、訪問履歴として後から確認出来ればと考えています。

<?php

//$DataNo はページを表すパラメータであり、 "1-2" といった文字列が代入されている。

//■見た詳細ページをクッキーに■
if(isset($_COOKIE["watch"])){

    $watch_data = $_COOKIE["watch"];

    $watch_array = explode(" ", $watch_data);

    $key = array_search($DataNo, $watch_array);

    if(is_numeric($key)){

        array_splice($watch_array, $key, 1);
    }

    if(count($watch_array) >= 20){    //20ページ以上は保存せず、古いデータから削除

        array_splice($watch_array, 0, 1);
    }

    $watch_array[] = $DataNo;

    $watch_data = implode(" ", $watch_array);

}
else{

    $watch_data = $DataNo;
}

setcookie("watch", $watch_data, time() + 60*60*24*30);


?>


これを朝から同じ内容のファイル(パラメータの部分だけ変更して)を複数用意し、を

http://***.com/AAA/cookieset1.php

http://***.com/AAA/cookieset2.php

http://***.com/AAA/cookieset3.php

http://***.com/AAA/cookieset4.php

のように設置し、また以下のスクリプトをcookie_delete.phpとして、

<?php
session_start();

setcookie("watch", '', time() - 1800);

?>


保存されたクッキーを消しては削除を行い、正常に機能しているか確認をしています。

しかし、上記のように同じディレクトリ内に各ファイルがある場合は正常に機能していることを確認しているものの、同じファイルでも、以下のようにディレクトリが違うと違うディレクトリで操作(アクセス)したクッキーは繁栄していないことに気が付きました。

http://***.com/AAA/cookieset1.php

http://***.com/AAA/cookieset2.php

http://***.com/AAA/cookieset3.php

http://***.com/AAA/cookieset4.php

http://***.com/AAA/cookie_view.php

http://***.com/AAA/cookie_delete.php

というセットの他、この構成、同じ内容のファイル群を

http://***.com/BBB/CCC/cookieset1.php

http://***.com/BBB/CCC/cookieset2.php

http://***.com/BBB/CCC/cookieset3.php

http://***.com/BBB/CCC/cookieset4.php

http://***.com/BBB/CCC/cookie_view.php

http://***.com/BBB/CCC/cookie_delete.php

と設置し動作を確認していますが、AAAディレクトリ内でセットされたクッキーは、BBB/CCC/内では削除できないといった現象が起きています。

各ディレクトリ内にあるcookie_view.phpは以下のような簡単なものです。

<?php

if(isset($_COOKIE["watch"])){

    $cookie = $_COOKIE["watch"];
    echo "cookie:".$cookie;
}

?>


以上のような状況ですが、これまで同じドメイン(サイト)内であれば設置場所は問われることなく動作すると考えていたのですが、今回ディレクトリが違うことで動きが異なる状況が起きています。

/AAA/cookie_delete.php
で削除したはずのクッキーが
/BBB/CCC/cookie_view.php
では残っているなど、です。

お恥ずかしい話、本日朝からずっと試行錯誤を繰り返しているため、解決に向けアドバイスを頂ければと考え投稿いたしました。

お忙しい中恐縮でうすが、アドバイスのほどお願い出来れば幸いです。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

動作に疑いのある場合は、まず、リファレンスマニュアルを読みましょう。

おそらく仕様通りの動作です。

setcookie - PHP マニュアル には、

path
サーバー上での、クッキーを有効としたいパス '/' をセットすると、クッキーは domain 配下の全てで有効となります。 '/foo/' をセットすると、クッキーは /foo/ ディレクトリとそのサブディレクトリ配下 (例えば /foo/bar/) で有効となります。 デフォルト値は、クッキーがセットされたときのカレントディレクトリです。

とあるように setcookie で、パスを指定しない場合は、カレントディレクトリがパスとして指定されるので、ディレクトリごとに異なる動作になるのは仕様です。

ドメインで Cookie を共通にしたい場合は、全てのCookie に対して、パスに / を指定してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/11 00:52

    CHERRYさん

    お忙しいところ、ご親切な回答をありがとうございます。
    動作確認し正常に機能しているまで確認いたしました。

    マニュアル・・キチンと読まなければダメですね。パスとドメインは省略可能と書かれた記事があったのですが、省略した場合、設置したディレクトリ以下が有効になるだけなのですね・・・
    以前、他のサイトで機能していたのですが、思い起こせば一番上の階層に設置していたことを思い出しました。

    貴重なアドバイス、ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる