2

我正在尝试在 setcookie 中为我的网站 cookie 设置路径,其中包含一个字符串,后跟 #wall ,我只能看到路径直到第一个字符串,它不接受路径的 # 部分。

代码是这样的:

 $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。事实上,它实际上将 cookie 写入document.cookie不同的片段,但必须硬重新加载页面才能更新 cookie。所以我怀疑这是一个有用的功能。

于 2016-10-19T07:16:58.217 回答