使用/ PHP设置Cookie的问题

时间:2009-09-02 21:29:33

标签: php cookies opensso

我在两个“域名”本地工作。我的机器上有enterprise.local和application.local虚拟主机,我需要为“local”或“.local”设置域cookie。但是我在设置cookie时遇到了一些麻烦。在application.local中,我有这个:

setcookie( 'iPlanetDirectoryPro', trim( $token_id ), '0', '/', '.local' );
header( 'Location: /adcom-sso' );

我也试过这个:

header( 'Set-Cookie: iPlanetDirectoryPro=' . trim( $token_id ) . '; path=/' );
header( 'Location: /adcom-sso' );

使用setcookie(),不会设置任何Cookie。使用Set-Cookie标头,Cookie 设置为。我从两者中删除了重定向,结果永远不会改变。它适用于Set-Cookie,但不适用于setcookie()。这没关系,因为我并不喜欢我使用的解决方案,但在Set-Cookie解决方案中,只要我添加一个域,它就会崩溃:

header( 'Set-Cookie: iPlanetDirectoryPro=' . trim( $token_id ) . '; path=/; domain=local' );

只要我添加了域值,就会出现标题错误:

Header may not contain more than a single header, new line detected.

我已尝试将域值设为“local”和“.local”。行为不会改变。

我很少明确访问cookie,所以我希望我只是遗漏了一些明显的东西,但我肯定没有看到它。任何见解都会非常感激。

更新:我想我已经把它缩小了一点。只要我不包含域值,似乎两种方式都可以正常工作。使用“local”或“.local”作为cookie的特定域可能会出现问题吗?

1 个答案:

答案 0 :(得分:2)

编辑: 我现在看看RFC2109,4.3.2拒绝Cookies:

  
      
  • “域”属性的值不包含嵌入的点或   不是以点开头。

         

    ...

  •   
  • 具有Domain = .com或Domain = .com。的Set-Cookie将永远是   拒绝,因为没有嵌入点。

  •   

由于安全问题,浏览器似乎拒绝'.local'。要为域设置cookie,它必须至少有两个点(例如'.cookiedomain.local')。

从一个子域(例如one.local)为另一个子域(例如another.local)设置cookie是不可能的AFAIK。您可以采取哪些措施来解决此问题,即将用户重定向到设置/获取所有Cookie的Cookie域,并将用户重新定向到他们来自的位置,并将url中包含的Cookie数据作为查询参数。微软为自己的域(msn.com,microsoft.com)做了(或者做过)这样的事情。


只有当你作为参数传递给header()的字符串包含一个没有空格或者空格的换行符时,才会触发你得到的错误(“标题可能不包含......”)选项卡(将继续下一行的标题)。

现在,setcookie()实际上会urlencode()其值(setrawcookie()不会),因此换行不会导致错误。

另一方面,trim()函数只会从其参数的开头和结尾删除空格,并保留其他任何换行符。所以也许你可以试试类似preg_replace('/\s+/', '')的东西。

为什么setcookie()方法对你不起作用对我来说并不是显而易见的。可能是你实际上看到了cookie(用setcookie()设置),但是并没有期待它中的url转义,并且在代码中的某个地方默默地拒绝它。

然而,这并不能解释为什么你的第一个header()似乎有用(带有换行符);似乎你的一些cookie值中包含换行符,有些则没有。

顺便说一下,如果你想让子域名看到cookie,那么将域设置为'.local'(领先'。')是正确的。

有关使用setcookie()设置cookie的一些其他注意事项在PHP文档中进行了讨论(尤其是用户注释)。