php setcookie中path和domain怎么设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php setcookie中path和domain怎么设置相关的知识,希望对你有一定的参考价值。

我有2个页面
页面1
<?
setcookie('state','in',time()+3600,'/abc','localhost');
?>

页面2
<?
echo $_COOKIE['state'];
?>

页面1位于根目录下,页面2位于根目录下abc文件夹下
测试过程:依次运行页面1和页面2
为什么在执行页面2的时候会提示错误,就是Cookie未设置的错误
是不是我的域名和路径填错了?应该怎么控制域名和路径的Cookie

setcookie函数原型如下:

bool setcookie(string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]])

其中name为cookie的名字,value为cookie的值,expire为过期时间的秒级时间戳(默认为0,代表内存cookie,关闭浏览器即失效)

path为cookie的路径,浏览器在发送cookie是只会发送对应路径及祖先级路径的cookie,如cookieA设置在根下,cookieB设置在/dir/下,访问dir的请求会带着cookieB和cookieA,但访问根路径的请求只会带着cookieA

domain为cookie的域名,只能设置为当前域或当前域的上级域。例如,一个在a.b.com的页面,可以设置domain为a.b.com,b.com,设置为a.b.com只能在a.b.com中访问cookie,若直接设置为b.com,则可以在其他b.com域下访问

secure为true会对cookie进行HTTPS加密传输

httponly为true时,只能通过请求发送cookie,使用javascript无法读取httponly的cookie,安全性更高

参考技术A domain和path是可选的, 全部不填写的话, 是当前域名的全路径可用. 你重新看下setcookie的文档.你参数个数写错了吧. 你是想同时定义state和in吗? 不能这样写.追问

你告诉我怎么写
我想设置一个cookie
name = state
value = in
有效时间1小时
只在localhost/abc下有效

参考技术B 你试试path=‘./abc’追问

不行 依然错误
确定浏览器开启了cookie

追答

我不知道你的虚拟主机是怎么配置的,
我的是work文件夹为主机的根目录,work文件夹下1.php文件setcookie('state','in',time()+3600,'/abc','localhost');
,work/abc下的2.php就可以获取cookie了

追问

啊,这是什么情况
我用的wamp,默认安装,没有做过什么修改
应该要配置什么项目呢

追答

你使用firebug吗,在运行1.php之后,可以在firebug中的cookies中查看一下state这个cookie存在不

追问

短标签模式设置过了,错误提示是没有对应索引,也就是cookie没有生效

追答

你是用的google chrome吗,如果是,那问题出在localhost上,你换成127.0.0.1,另外,你使用火狐等其他浏览器试试,我是用的火狐,没有问题,这是个老问题了,chrome上only set domain cookies for registry controlled domains,比如.com、.so后缀的,不能设置内网主机,比如localhost,如果你是liunx系统,可以在/etc/hosts中设置127.0.0.1 localhost.com

追问

非常感谢,终于成功了,果然是浏览器的问题,用火狐就可以,IE 360 google都不行
看来想用路径来区别cookie的作用范围有点不靠谱呀

本回答被提问者采纳

php setcookie 域

【中文标题】php setcookie 域【英文标题】:php setcookie domain 【发布时间】:2011-01-18 02:32:39 【问题描述】:

一些不是我编写的应用程序,也不是用 PHP 编写的,它为域“www.domain.com”创建了一个 cookie。

我正在尝试替换该 cookie。所以在php中我做了:

setcookie('mycookie','mydata',time() + 2*7*24*60*60,'/','www.domain.com', false);

但是,生成的 cookie 是为域创建的:“.www.domain.com”,请注意点“.”领先于领域。

所以它不会替换它,它会创建另一个 cookie。 我能做什么?

【问题讨论】:

www.domain.com.www.domain.com 域(注意前导点)的处理方式相同,至少按照 RFC 6265,这是 每个 现代浏览器实现的。它表示前导点只是忽略。但是如果 cookie 没有成功地相互覆盖,这可能是由于属性“path”、“domain”、“secure”或“httpOnly”的不同,我们在这里看不到。一般来说,您可以尝试github.com/delight-im/PHP-Cookie 以更轻松地管理 cookie。 【参考方案1】:

这里也解决了这个问题: https://www.php.net/manual/en/function.setcookie.php

查看jah的评论:

如果要将 cookie 限制为单个主机,请将域参数提供为空字符串

您也可以尝试将.domain.com 作为域。尾随点将允许 domain.com 的所有子域的 cookie 并可能覆盖 www.-cookie,但我将首先使用上述解决方案。

【讨论】:

我也在寻找这个问题的答案,果然,让域空白工作。谢谢。 请注意,如果您对域使用空字符串,您可能会发现某些浏览器会感到困惑。如果可以,请使用 getenv('HTTP_HOST')【参考方案2】:

如果你指定一个域,你应该遵循 RFC 2109 并在域前加上一个点;否则客户会这样做。但是如果你根本不指定域,客户端将获取请求的域。

【讨论】:

此默认行为是否记录在某处? "如果服务器未指定 cookie 的域和路径属性,则它们默认为所请求资源的域和路径。"链接:en.wikipedia.org/wiki/HTTP_cookie#Domain_and_path【参考方案3】:

这不是一个错误吗? 如果我希望我的 cookie 仅位于 www.example.com 而不是 something.www.example.com 怎么办?例如性能。 我应该能够指定 cookie 域而不是所有 [sub][sub] 子域的通配符。 更不用说它导致的错误数量,例如通过 php 设置 cookie 并尝试通过 JavaScript 删除它(这不会添加愚蠢的点)。

【讨论】:

【参考方案4】:

尝试创建几个具有相同名称但域不同的其他 cookie。示例:

setcookie('mycookie','mydata1',time() + 2*7*24*60*60,'/','www.domain.com', false);
setcookie('mycookie','mydata2',time() + 2*7*24*60*60,'/','www.domain.com', false);
setcookie('mycookie_top','mydata1',time() + 2*7*24*60*60,'/','domain.com', false);
setcookie('mycookie_top','mydata2',time() + 2*7*24*60*60,'/','domain.com', false);

然后在 Firebug 中检查这些命令创建的 cookie。如果你一直得到一个双重cookie,那么这可能是PHP中的一个错误。另外,尝试在javascript代码中设置cookie,看看是否还有同样的问题。

【讨论】:

以上是关于php setcookie中path和domain怎么设置的主要内容,如果未能解决你的问题,请参考以下文章

跟着百度学PHP[8]-setcookie的其他参数学习

php中session和cookie的使用及区别

PHP setcookie 作用域设为ip地址是有效,设为.domain.com.cn时无效,跪求解决。

php 基础复习 2018-06-18

让 PHP COOKIE 立即生效(不用刷新就可以使用)

setcookie 的七个参数