在setcookie函数PHP中的路径后附加Hash片段

时间:2016-10-19 06:55:13

标签: php cookies session-cookies setcookie cookie-path

我正在尝试在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  

1 个答案:

答案 0 :(得分:1)

片段不是Path

的一部分

#字符指定网址(RFC 3986)的片段部分:

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

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

因此片段(特别是wall)是网址的不同部分,并且被视为path的一部分:

  

路径由第一个问号("?")或数字符号终止   ("#")字符,或URI的末尾。

此外,片段依赖于文档MIME类型,并由用户代理(RFC 3986, 3.5. Fragment)评估,即片段永远不会发送到服务器:

  

...片段标识符未在特定于方案的中使用   处理URI;相反,片段标识符是分开的   从取消引用之前的其余URI开始,从而得到   识别片段本身内的信息被解除引用   完全由用户代理...

换句话说,URL片段不应该在cookie Path属性中工作,并且服务器不应该知道有关片段的任何信息。

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。所以我怀疑这是一个有用的功能。