什么“cookie的价值在发送cookie时自动进行URL编码,并在收到时自动解码”是什么意思?

时间:2017-01-21 13:54:11

标签: php cookies urlencode setcookie urldecode

在学习PHP的Cookie概念时,我遇到了w3schools PHP Tutorial的以下声明:

  

Cookie的值在发送Cookie时会自动进行网址编码,并在收到时自动解码(以防止网址编码,改为使用setrawcookie()

我没有理解这句话的意思。我对以上陈述有疑问:

  1. 从哪里发送cookie给谁以及从谁那里收到cookie?
  2. 实际上通过“cookie的值在发送cookie时自动进行URL编码,并在收到时自动解码”实际发生了什么?
  3. setrawcookie()扮演什么角色?我的意思是它实际上做了什么?
  4. 以下是我尝试理解cookie概念的代码:

    <?php
      $cookie_name  = "user";
      $cookie_value = "John Doe";
      setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); 
    
     <?php
       if(!isset($_COOKIE[$cookie_name])) {
         echo "Cookie named '" . $cookie_name . "' is not set!";
       } else {
         echo "Cookie '" . $cookie_name . "' is set!<br>";
         echo "Value is: " . $_COOKIE[$cookie_name];
       }
    

    有人请参考上述代码清除我的疑问吗?

2 个答案:

答案 0 :(得分:1)

Http cookies是在客户端(浏览器)和网络服务器之间传输的标头。

当您使用setcookie时,您正在做的是指示PHP解释器在其响应中使用以下格式注入标头:

Set-Cookie:name=value

该cookie将由浏览器存储,并在Cookie请求标头中的未来请求(返回同一主机)中返回,如下所示:

Cookie:name=value;cookie2=value;cookie3=value

通常情况下,转移时你应该对任何特殊字符进行urlencode。假设我想指定一个名为“operator”的cookie,其值为“&gt;”,那么我应该发出这个标题:

Set-Cookie:operator=%3E

当它表示该值自动被urlencoded时,表示您不必担心这一点。你可以这样做:

setcookie('operator', ">");

PHP将直接处理urlencoding,生成正确的标题。

在服务器端,您将在$_COOKIES超全局中收到Cookie,与$_GET$_POST相同,系统会自动为您解码值。因此,如果客户返回之前设置的Cookie %3E,您会在代码中看到:>

如果您使用浏览器检查器,则可以在任何请求 - 响应中看到相关标头。 E.g:

请求(返回Cookie)

request sending cookie

响应(设置Cookie)

response returning cookie

setrawcookie,也是如此,但您必须自己进行urlencode。来自文档:

  

setrawcookie()与setcookie()完全相同,只是在发送到浏览器时,cookie值不会自动进行urlencoded。

更有可能的是,您没有任何理由直接使用setrawcookie

答案 1 :(得分:1)

  

从哪里发送cookie给谁以及从谁那里收到cookie?

最初,cookie将从服务器发送到浏览器。在每个后续请求中,浏览器都会将其发送回服务器。

  

通过“发送cookie时cookie的值自动进行URL编码,并在收到时自动解码”实际发生了什么?

Cookie中可以显示哪些字符有限制。 URL编码将这些字符转换为不同的表示,以使它们有效。

您不需要自己执行此操作,因为PHP setcookie方法将为您执行此操作,$_COOKIE变量将在您的代码与其交互时包含已解码的版本。< / p>

  

setrawcookie()扮演什么角色?我的意思是它实际上做了什么?

它允许您设置没有该编码的cookie(因此您必须手动编码)。您可能永远不需要使用它。