2

#wall が続く文字列を含む Web サイトの Cookie の setcookie にパスを設定しようとしています。最初の文字列までしかパスが表示されず、パスの # 部分を受け入れません。

コードは次のようになります。

 $wall = array(
     $this->database,
     $this->response['grouplist'][0],
     $this->username
 );

 setcookie(
     "wall",
     json_encode($wall),
     time() + 3600 * 24 * 1000 ,
     "/" + $this->database + "/#wall",
     ".mywebsite.com",
     0
 );

 session_set_cookie_params(0, '/', '.mywebsite.com');

出力:

mywebsite.com   /S71c9524b57ab1b3383bcb14478b570b6      2019-07-16T06:37:55.065Z        92  
4

1 に答える 1

1

フラグメントはパスの一部ではありません

この#文字は、URL のフラグメント部分を指定します ( RFC 3986 ):

  URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

  hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty

したがって、フラグメント (wall特に) は URL の別の部分であり、パスの一部とは見なされません

パスは、最初の疑問符 (「?」) または番号記号 (「#」) 文字、または URI の終わりで終了します。

さらに、フラグメントはドキュメントの MIME タイプに依存し、ユーザー エージェント ( RFC 3986, 3.5. Fragment ) によって評価されます。つまり、フラグメントはサーバーに送信されません。


...フラグメント識別子は、URIのスキーム固有の処理では使用されません。代わりに、フラグメント識別子は
逆参照の前に残りの URI から分離される
ため、フラグメント自体内の識別情報は
、ユーザー エージェントによってのみ逆参照されます...

言い換えると、URL フラグメントは CookiePath属性で機能することは想定されておらず、サーバーはフラグメントについて何も認識していないことが想定されています。

PHP 構文

また、+は算術演算子であるため、"/" + $this->database + "/#wall"は に評価され0ます。連結を意味する場合は、.代わりに (ドット) 演算子を使用します。

$s = 'abc';
echo "/" + $s + "/#wall", PHP_EOL;
echo "/" . $s . "/#wall", PHP_EOL;
echo "/{$s}/#wall", PHP_EOL;

出力

0
/abc/#wall
/abc/#wall

したがって、「算術」式を に置き換える必要があります"/{$this->database}/#wall"

それうまくいくかもしれません...時々

現在のバージョンの Mozilla Firefox がさまざまなフラグメントを持つパスの Cookie を処理する方法をテストしました。順番に、実際にはdocument.cookieさまざまなフラグメントの Cookie を書き込みますが、Cookie を更新するには、ページをハードリロードする必要があります。したがって、これが便利な機能であるとは思えません。

于 2016-10-19T07:16:58.217 に答える