解决PHP Warning: Cannot modify header information - headers already sent by的终极方案
原因分析:在PHP里Cookie的使用是有一些限制的。
1、使用setcookie必须在标签之前
2、使用setcookie之前,不可以使用echo输入内容
3、直到网页被加载完后,cookie才会出现
4、setcookie必须放到任何资料输出浏览器前,才送出
解决方案:
1,文件开头写上ob_start();
ob_start :打开输出缓冲区
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
2,php.ini 把 output_buffering 设为 on 重起apache
3,部分情况是多出现在UTF编码的文件。因为在一般的文本编辑器(记事本),尤其是微软的各种产品,在编辑完保存完后,总是会自动在最前面缀上一个BOM,在windows 托管的服务器上没问题,而在UNIX服务器上就会产生问题。比如在代码中用到session或header时,因前有看不见的BOM
你可以用写字板打开,光标移到最前面,先退行,在按delete键去掉刚才加的那一空行。在保存的时候,写字板总是回保存为UTF-8编码的格式;同样你可以在dreamweaver的专业编辑器中已定为UTF-8格式进行编辑。
如何跨主域实现SSO
不同主域的SSO的实现,好多都是用一些特殊的软件系统来支撑的。同一主域(即:同一个一级域名下的所有子域名)下包括多服务器共享SESSION数据实现的方法很多。
SESSION也是需要COOKIE来支持的,COOKIE的不支持跨主域就决定了SESSION不能跨主域!
一、假设有A.COM , B.COM , C.COM 这三个主域,其中A.COM主要负责验证通行证(速度比较快),B.COM 和 C.COM都是具体的应用
二、B.COM 和 C.COM 以及 A.COM 自己的一些应用都需要到A.COM来获取信任(登陆)
三、为各主域分配一个子域 passport.B.COM、passport.C.COM,它们的IP都指向A.COM所在的主机地址
四、用户在登陆通过验证后,设立一个跳转规则,以session_id作为参数,逐个跳转 ?passport.B.COM、passport.C.COM (实际上这些子域可以建立到A主机的默认站点,通过数组以及一些参数就可以实现逐个快速跳转),跳转直接用PHP的 header(”Location: passport.B.COM/?sid=xxxxxxxx&i=0″); ,在跳转的同时,覆盖当前主域的session_id为传递过来的session_id就可以了。
这里有一些考虑:
1、将各 passport.X.COM分配到同一个速度比较快的主机上,有利于快速跳转,而用户看不见复杂跳转的过程。。。
2、同一主机上跳转可以避免中间跳转环节的出错导致跳转失败。

