用 JS 设置 cookie,用 PHP 问题读取

Posted

技术标签:

【中文标题】用 JS 设置 cookie,用 PHP 问题读取【英文标题】:Set cookie wih JS, read with PHP problem 【发布时间】:2011-06-30 00:36:18 【问题描述】:

我正在尝试使用 javascript 设置一个 cookie,并使用 php 在另一个页面中读取它。 我可以通过这样做来编写cookie

document.cookie = cookieName+"="+cookieValue;

我部分工作。 - cookie 已写入,我可以使用 $_COOKIE[cookieName] 读取它,但只能在同一个网页中。

这真的不是很有用。我需要在另一页阅读它。我通常在 asp.net 和 c# 中开发,所以我对 php 很陌生。我做错了吗?

感谢您的宝贵时间!

编辑1: 两个页面都在同一个域中。例如。 site.com/index.php -> site.com/index2.php

编辑2: cookie通过以下方式设置在一页中:

function SetCookie(cookieName,cookieValue,nDays) 
 var today = new Date();
 var expire = new Date();
 if (nDays==null || nDays==0) nDays=1;
 expire.setTime(today.getTime() + 3600000*24*nDays);
 document.cookie = cookieName+"="+escape(cookieValue)
                 + ";expires="+expire.toGMTString();

在另一个页面中它无法访问,但在同一页面中它可以...

编辑3: 我尝试设置域并将path=<?php echo $_SERVER['HTTP_HOST']; ?> 添加到 javascript 代码中......仍然没有......

编辑4: 到目前为止我有..

document.cookie = cookieName+"="+escape(cookieValue)+"; expires="+expire.toGMTString()+"; path=/"+"; domain=.<?php echo $_SERVER['HTTP_HOST']; ?>";

我仍然只能从同一页面读取 cookie..

编辑5: 哦..我的..上帝...一直是一个错字...只需要删除“path=/“+”; dom ...”我为自己感到羞耻就在现在…… 同时我也重置了我的cookies,所以Jared现在很遗憾我不能接受你的帖子作为anwser ... 我给我的名字带来了耻辱!!!....

【问题讨论】:

您记得设置Expires 值吗? @Andrej - 看我的回答;你真的不需要推出自己的功能,使用 QuirksMode 功能(我的域添加)。这就是你所需要的。 :) @Andrej - 另外,您使用的路径不正确;这与您的域相关,您需要一个带通配符的域(在 cookie 的情况下)来选择所有子域。所以[other cookie stuff]; path=/; domain=.&lt;?php echo $_SERVER['HTTP_HOST']; ?&gt;. 我刚试了..对我不起作用..你试过了吗? @Andrej - 为什么你有 path=/"+"; ? “+”是干什么用的? 【参考方案1】:

Cookie 只能由在同一域上运行的代码访问。

如果您的 PHP 和 .NET 代码在不同的域上运行,则浏览器不会将域 A 的 cookie 发送到域 B 的请求(反之亦然)——Same-Origin Policy 的这种强制执行有助于保持网络快速(因为浏览器不必为每个请求传输所有用户的 cookie,并且服务器不必解析数兆字节的无用数据来获取它感兴趣的两个字段)并且安全(因为如果我有来自您的带有安全会话密钥的 cookie,我可以劫持 您的 帐户。)

@Jared 从QuirksMode 发布了一个很好的链接,该链接优秀概述了设置路径和域,因此您可以在自己的站点中获得所需的访问权限。

【讨论】:

每个域现在只能有 1 页?这真的很糟糕。 @Michael Jasper,不,域是指定的任何目录。如果没有指定目录,则使用当前目录。【参考方案2】:

你能提供更多信息吗?他们都在同一个域上只是不同的文件吗?是线

document.cookie = cookieName+"="+cookieValue;

您用于创建 cookie 的唯一一行?

【讨论】:

【参考方案3】:

在此处阅读设置 Javascript cookie,尤其是路径和域访问:

http://www.quirksmode.org/js/cookies.html

我认为正在发生的事情是两件事之一:

    您没有从同一个域/子域访问 cookie,和/或 其他页面不是 cookie 指定路径的一部分。

因此,您的 cookie 没有向浏览器提供相关信息,以便跨子域和/或目录路径访问它。

document.cookie = 'ppkcookie1=testcookie; expires=Thu, 2 Aug 2001 20:47:11 UTC; path=/; ;domain=.example.com'

注意,.example.com 只是一个示例域(您需要在其中使用您的域),除了初始的 . 之外,您不需要通配符,因为它可以跨越所有子域。您需要生成一个expires= 日期。来自 QuirksMode:

function createCookie(name,value,days) 
    if (days) 
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
     else 
        var expires = "";
    
    document.cookie = name+"="+value+expires+"; path=/; domain=.example.com";

我在 QuirksMode 的函数中添加了domain= 位。

EDIT(以下示例最初引用了我个人网站上的页面。)

Andrej,这对我来说非常适合:

http://example.com/test.php

function createCookie(name,value,days) 
    if (days) 
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/; domain=.example.com";


createCookie('cookieee','stuff','22');

http://example.com/test/test.php

<pre>
<?php 

print_r($_COOKIE);

?>

$_COOKIE 的打印输出将显示 cookie。请注意,当我检查 cookie 时,.example.com 已正确设置为域。

【讨论】:

【参考方案4】:

如果您想扩展 cookie 可用的域,您需要将其指定为 cookie 的一部分:

document.cookie = cookieName + '=' + cookieValue + '; path=/;';

【讨论】:

【参考方案5】:

你需要为cookie设置路径。

例如在javascript中如果不指定cookie路径,则设置为当前页面的路径。

在 JS 中:

设置cookie:

document.cookie = "key=value; expires=Fri, 03 Aug 2018 12:00:00 UTC; path=/";

在 PHP 中:

设置cookie:

setcookie('key', 'value', (time() + (3600*2)), '/');

访问:

if (isset($_COOKIE['key'])) echo $_COOKIE['key'];

【讨论】:

以上是关于用 JS 设置 cookie,用 PHP 问题读取的主要内容,如果未能解决你的问题,请参考以下文章

JS设置cookie读取cookie删除cookie

JS设置cookie读取cookie删除cookie

JS设置cookie读取cookie删除cookie

运用JS设置cookie读取cookie删除cookie

运用JS设置cookie读取cookie删除cookie

jQuery怎么设置读取删除清空cookie