我正在尝试在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
答案 0 :(得分:1)
#
字符指定网址(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
属性中工作,并且服务器不应该知道有关片段的任何信息。
另请注意,+
是算术运算符,因此"/" + $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。所以我怀疑这是一个有用的功能。