热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php不同子域的同名cookie问题解决方法

$_COOKIE是php中一个非常好用的东西,但是有时我们会碰到同域名下的不同子域名一样,这样就会存在只能保留一个cookie的问题。

$_COOKIE是php中一个非常好用的东西,但是有时我们会碰到同域名下的不同子域名一样,这样就会存在只能保留一个COOKIE的问题。

PHP的超全局变量$_COOKIE带来了很多便利,在某些情况下也会造成困惑。比如在根域和子域下存在同名COOKIE,$_COOKIE中只能保存一个,应该是哪个?

RFC建议使用长度最长的那个,这样精度最高,但是不同浏览器处理方式不同。我只测试了Chrome,Chrome中根域和子域的同名COOKIE都发送出去了,这样PHP只接收排在前面的同名COOKIE,后面的被忽略,这样很容易接收到错误的值。据说Safari遵循了RFC的建议,没有亲自测试,其他浏览器也没有测试。

首先通过SwitchHosts设定虚拟域名:www.phpfensi.com,并且配置好Web服务器,当然,你手动设置Hosts文件也可以,我本意是为了多介绍几个工具,然后编写设置COOKIE的PHP脚本,先设置子域,再设置根域,代码如下:

  1. setCOOKIE("bar""www", time() + 10, "/""www.phpfensi.com");  
  2. setCOOKIE("bar""foo", time() + 10, "/"".phpfensi.com"); 
  3. ?> 

再编写浏览COOKIE的脚本,代码如下:

  1. var_dump($_COOKIE); 
  2. ?> 

BTW:最初写脚本的时候我竟然在setCOOKIE前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。

先设置再浏览,就能看到结果了,结果显示有效的是子域下的COOKIE,重开一个浏览器窗口,并使用WebDeveloper删除COOKIE,或手动删除,避免对结果造成影响,然后调换两次调用setCOOKIE的顺序,也就是先设置根域,再设置子域,代码如下:

  1. setCOOKIE("bar""foo", time() + 10, "/"".phpfensi.com");  
  2. setCOOKIE("bar""www", time() + 10, "/""www.phpfensi.com"); 
  3. ?> 

先设置再浏览,就能看到结果了,结果显示有效的是根域下的COOKIE,重复两次测试过程,并用Firebug记录下请求头的差异:

第一次先设置子域,再设置根域:请求头COOKIE的值是bar=www;bar=foo,结果有效的是bar=www

第二次先设置根域,再设置子域:请求头COOKIE的值是bar=foo;bar=www,结果有效的是bar=foo

也就说,同名COOKIE对于服务端PHP来说,在请求头COOKIE中,哪个在前哪个生效,后面的会被忽略。

如果使用的不是Firefox,那就用不了Firebug,此时可以用PHP代码来检测COOKIE头:if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);

以上的实验结论是基于Firefox而言的,由于不同的浏览器发送COOKIE的策略可能有差异,所以在其他浏览器上结果可能会有所不同,比如在Safari下就始终是子域有效,其他浏览器如Opera,Chrome等未仔细测试。鉴于这个混乱的结论,所以还是不要在子域和根域下使用同名COOKIE为好!

结论:目前在根域和子域中使用同名COOKIE是非常不明智的


推荐阅读
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 本文深入探讨了Ajax的工作机制及其在现代Web开发中的应用。Ajax作为一种异步通信技术,改变了传统的客户端与服务器直接交互的模式。通过引入Ajax,客户端与服务器之间的通信变得更加高效和灵活。文章详细分析了Ajax的核心原理,包括XMLHttpRequest对象的使用、数据传输格式(如JSON和XML)以及事件处理机制。此外,还介绍了Ajax在提升用户体验、实现动态页面更新等方面的具体应用,并讨论了其在当前Web开发中的重要性和未来发展趋势。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 深入解析HTML5字符集属性:charset与defaultCharset
    本文将详细介绍HTML5中新增的字符集属性charset和defaultCharset,帮助开发者更好地理解和应用这些属性,以确保网页在不同环境下的正确显示。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文详细介绍了如何使用 CSS3 的 background-clip 和 background-origin 属性来裁剪和定位背景图片,以及如何通过 background-size 控制背景图片的尺寸。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
author-avatar
手机用户2502917001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有