同一网站不同和二级域名和不同子目录的cookie
1、cookie二级域名的实现:
用户其中一个站点登录,而且可以各个子频道间切换,保持登录状态设置Cookie时,使用如下代码即可:
setcookie(name,value,expire,path,"domain.com");
这样,在每个二级域名都能读取这个Cookie的值。 参见:
cookie共享于二级域名
http://lonvea.iteye.com/blog/1160577
一个cookie如上4个重要的属性:
1)maxAge:cookie被客户端保持的时间,单位为(秒),正数表示在指定的秒数后过期被客户端删除,0表示删除此cookie(置空),负数则表示此cookie不会被客户端存储,将在浏览器关闭后清除.
2)domain:cookie可被有效操作的域,可以为ip/hostname等,不过需要声明:*.abc.com,.abc.com,abc.com这三种方式会有区别,客户端会做简单的匹配.多数情况下直接使用abc.com可以接受多级子域名.只有正确匹配domain的cookie才会被发送给server.
3)secure:是否只允许安全加密url访问,默认为false,如果为true,那么cookie只对https/SSL等加密连接才会发送给server.
4)path:cookie对domain何路径下访问有效,"/"表示domain下根目录中所有请求有效,"/open"表示只对domain/open目录下请求有效,如果此path忘记设置,你将遇到一个很尴尬的问题:明明在其他页面设置了cookie输出,但是换个页面却死活不行..
domain和path是决定可跨域的2个参数.
对于domain,"abc.com"则可以在abc.com主域名之下的多级子域名有效,".abc.com"只能在二级域名以及"www.abc.com"下有效,其实客户端只是做了简单的匹配..你可以在此基础上做更多的分级控制..
path是个有参考意义的属性,对于部分路径下开放访问的系统有意义,比如:abc.com/open下的程序和登录是开放给特殊开发者接入的,这里的数据活着cookie需要做一些另类的处理..
2、同一网站不同子目录的cookie要设置path,才能互相访问。参见:
cookie path
http://www.cnblogs.com/ainiaa/archive/2011/11/18/2253841.html
以前使用cookie的时候 没有在意path的问题。这次公司商城实现了静态化的功能,多了2级目录。导致了我在商品详情页面设置好的cookie(path为/good/商品ID/)在店铺首页竟然访问不到(店铺首页的path为'/store/')。cookie的名称都是一致的。唯一不同的只有path。在商品详情页设置cookie的时候吧path设置成‘/’,这样修改之后就可以正常的在店铺首页取到设置好的cookie了。
使用关键字 javascript cookie path 还搜索到了,原来10年来IE一直存在一个cookie path的一个bug(原文地址:http://conkeyn.iteye.com/blog/423549)。
手上一个广告项目,在Firefox下顺利测试通过。自信JS代码能兼容IE,FF测试过后随手就仍给CS测试,结果CS反馈说有问题。排查一番, 发现居然和Javascript 设置 Cookie 时的 path 有关。IE下Cookie种在 /或者URL所在路径时正常,如果Cookie值作用域在当前URL下则IE下javascript 无法获取到设置的Cookie值。
看下面演示代码:
- var cookie_name = "name";
- var cookie_value = "value";
- expires = new Date();
- expires.setTime(expires.getTime() + 86400 * 1000);
- // 有Bug document.cookie无法独到cookie_name值
- document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
- + "; expires=" + expires.toGMTString() + "; path="
- + window.location.pathname;
- // 正常
- document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
- + "; expires=" + expires.toGMTString() + "; path=/test/";
- // 正常
- document.cookie = "cookie_name=" + encodeURIComponent(cookie_value)
- + "; expires=" + expires.toGMTString() + "; path=/";
怀疑是IE的Bug、
在google上 搜了下关键词: ie javascript cookie path bug
同样的问题在罪与罚 的博客上也有描述,而且博主联系过微软IEBLOG 的Eric。得到的回复是:
You have uncovered an IE bug where cookies that are set with a path that contains a filename (e.g. /page.htm) are not accessible to the document.cookie function, although they are correctly sent to the server in the HTTP header. This has been broken for at least 10 years and unfortunately probably will not be fixed in IE8.
Thanks,
-Eric
一个存在10年的Bug。。。而且IE8也不会修复,实在是无语。
需求是cookie值只对当前页面有效,没办法只好用替代方案,看代码:
- //IE Cookie Bug 替代方案
- var cookie_path = window.location.pathname;
- var cookie_name = encodeURIComponent(cookie_path.substring(cookie_path
- .lastIndexOf('/') + 1));
- cookie_path = cookie_path.substring(0, cookie_path.lastIndexOf('/') + 1);
- var cookie_value = "value";
- expires = new Date();
- expires.setTime(expires.getTime() + 86400 * 1000);
- document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)
- + "; expires=" + expires.toGMTString() + "; path=" + cookie_path;
替代方案根据每个页面的URL文件名来做Cookie名,有效范围在当前页路经下。
如:url 等于 /test/test.html
则cookie名为test.html,有效路径为/test/
这样也可以做到同一个js部署在每个页面上能读到只对当前URL有效的cookie值。代价是当用户在同一级目录下访问很多页面时会导致cookie值不 断增大。结果是当前路径下的每个http请求都带很长一段的cookie,直接导致服务器接收客户端request的header长度增长,流量增长的同 时服务器负担也变重。而且根据 RFC 2109 的定义Cookie也有长度和个数限制,IE允许的最大 Cookie 长度是 4096 字节,允许50个 Cookie 名-值对。如果要突破50个名-值对的限制,可以在一个名-值使用Cookie字典的方式保存更多的Cookie变量。
http://blog.seateng.cn/archives/2009/03/ie-javascript-cookie-path-bug.html
这次的静态化功能让我学到了cookie的这个问题。很是高兴啊。
这次静态化功能还涉及到了一个跨域请求的问题。事情是这样的:
我在搜索模块(域名search.emall.xxx.xxx)需要显示当前用户的商品浏览历史。二者个商品浏览历史是在主站的cookie里面存储的。为了方便我们把COOKIE_DOMAIN都设置成了一样的一级域名,使用js的cookie却不能获得设置好的cookie。但是,使用firebug + firecookie却可以清楚的看到cookie是存在的且没有过期。唯一不同的就好似cookie的domain和当前模块的domain一致(cookie是在主站设置好的emall.xxx.xxx,当前search的域名为search.emall.xxx.xxx)。 这很容易就让人想到是cookie domain的问题导致的。问题原因找到了,解决它。使用js不行我就我就使用ajax的方式请求主站,在主站吧cookie取出来,然后再原样的返回。编码,运行,反先,ajax请求还是不能获得(使用get的方式发送请求)。把ajax请求的地址放在地址栏里面,确实有内容返回,但是使用ajax请求的话,还是不能获得cookie的值。很显然,这种情况就是传说中的跨域请求的问题。这问题咱没有解决过,怎么办那?突然想起来了,该模块下用户登录信息就是通过ajax异步取出来的。同时ajax请求为什么用户的登录信息可以拿到我的为什么就拿不到???
找原因。找到请求用户信息的代码,才发现,原来请求的时候和我的ajax还有一点不一样。请求用户信息的方式为:
JS代码如下:
//跨域获取数据
jQuery.ajax({
type : "GET",
url : temp_domain_url+"/index.php?",
data : "act=get_user_info&php_session_id="+jQuery.cookie('COOKIE_ID')+"&jsoncallback=?",
dataType : "jsonp",
jsonnp : 'callback',
success:function(data){
...
...
...
}
});
php代码如下:
function get_user_info()
{
$gbh_goods_info = $_COOKIE['gbh_goods_info'] ? $_COOKIE['gbh_goods_info'] : json_encode(false);
if ($gbh_goods_info && get_magic_quotes_gpc())
{//没有这个的话会出现错误
$gbh_goods_info = stripslashes($gbh_goods_info);
}
$gbh_goods_info = json_decode($gbh_goods_info);
echo $_GET['callback']."({msg: ".json_encode($gbh_goods_info)."});";
exit;
}
这才弄明白到底是什么原因了。
照着葫芦画瓢终于吧功能实现了。。。。
同一网站不同和二级域名和不同子目录的cookie的更多相关文章
- Linux虚拟主机通过程序实现二级域名绑定到子目录
虚拟主机中CP控制台不支持将二级域名绑定到子目录的功能,用户可以通过程序实现将二级域名绑定到子目录. 有两种方法将二级域名绑定到子目录: 1. 配置.htaccess, 通过伪静态代码实现.具体实现方 ...
- 为阿里云ECS服务器二级域名绑定tomcat子目录,实现一个IP多个二级域名
摘要:前几天租了阿里云ECS服务器,选择的Windows系统,并在服务器上部署了tomcat服务器,随后我又买了一个域名,可一个域名只能指向一个IP地址,包括二级域名也只能指向一个IP地址,并不能指向 ...
- asp.net 配置二级域名的共享session,并实现sso单点登录
公司最近做了一个新网站.原先网站的网址是www.xxxx.com.新做的网站要部署到info.xxxx.com.这两个网站要实现单点登录.而新老网站本身机构的原因,对于登录状态的判断,说白了就是对于s ...
- 顶级域名和二级域名共享cookie及相互删除cookie
在CSDN看到一个cookie设置domain时,如何删除的问题, 自己也只知道domain设置为顶级域名时可以被其他二级域名共享,但是如何删除还是有一点搞不清楚,所以特意测试了下cookie和dom ...
- 如何在一个顶级域名下用两个二级域名访问vps下的两个项目网站--完美解决骗
本人是原址是http://www.webzhe.com/server/340 后经过本人的实践修改,增加截图,等具体的步骤,完美解决 如何在vps中设置二级域名开通子网站,这个问题涉及到两步:一首先要 ...
- xampp配置二级域名通过不同端口访问不同网站
首先需要在xampp\apache\conf\extra\httpd-vhost.conf中写入配置的二级域名 <VirtualHost *:8081> // 该网站通过监测8081端口 ...
- 通过Nginx为网站配置二级域名
目录 配置域名解析 配置Nginx 重启Nginx 补充 需求:服务器上面运行多个项目:实现每个二级域名访问对应项目: 服务器:阿里云服务器:域名:阿里云注册: 配置域名解析 即配置DNS解析.一定要 ...
- 关于网站子目录绑定二级域名的方法(php网站手机端)
最近帮客户做zencart网站手机模板用到了二级域名,通过判断手机访问来调用二级目录程序,http://afish.cnblogs.com/ 怎么说都比 http://www.cnblogs.com/ ...
- 同一服务器下发布两个不同网站(war包)的方法(这里采用的是二级域名的方法)
这里是在阿里云服务器的上部署 在本地测试好之后,打包,然后发到服务器上的tomcat的webapp目录上(这个可能会有个bug,先启动下服务器,然后关掉,再启动,那个war包对应的文件才会出来) 这里 ...
随机推荐
- Oracle DB 分区特性概述 Overview of Partitions
概述:在Oracle数据库中,分区(partitioning)可以使非常大的表(table)或索引(index)分解为小的易管理的块(pieces),这些块被称作分区(partitions).每个分区 ...
- [转]ORACLE的ProC用法讲解
pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp parse=none iname=filename.pc oname=filename.cp ...
- 算法:C++排列组合
题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <ios ...
- 解惑:NFC手机如何轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,只要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内余额.卡的信息,还可以给卡进行充值,非常贴心实用. 但是很多网友表示担忧,要是别人 ...
- flask-cors 实现跨域请求
安装:pip install -U flask-cors from flask import Flask from flask.ext.cors import CORS app = Flask(__n ...
- C#操作FTP, FTPHelper和SFTPHelper
1. FTPHelper using System; using System.Collections.Generic; using System.IO; using System.Net; usin ...
- linux php安装zookeeper扩展
linux php安装zookeeper扩展 tags:php zookeeper linux ext 前言: zookeeper提供很犀利的命名服务,并且集群操作具有原子性,所以在我的多个项目中被采 ...
- [转]vim常用命令
[转]vim常用命令 http://www.cnblogs.com/sunyubo/archive/2010/01/06/2282198.html http://blog.csdn.net/wooin ...
- eclipse插件开发中全局对象的获取
转自:http://blog.csdn.net/liaomin416100569/article/details/7165425 1.获取系统默认的ShellShell shell = Platfor ...
- ATR与ATS
ATR:answer to reset 复位应答 ATS:answer to select 选择应答