1

我在两个“域”本地工作。我的机器上有 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-Cookiesetcookie()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 的特定域会不会有问题?

4

1 回答 1

2

编辑:我现在看过RFC2109 , 4.3.2 Rejecting Cookies:

  • Domain 属性的值不包含嵌入的点或不以点开头。

    ...

  • Domain=.com 或 Domain=.com. 的 Set-Cookie 将始终被拒绝,因为没有嵌入的点。

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

AFAIK 无法从一个子域(例如 one.local)为另一个子域(例如 another.local)设置 cookie。您可以做些什么来克服这个问题,将用户重定向到一个 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()PHP 文档(尤其是用户评论)中讨论了有关设置 cookie 的一些额外注意事项。

于 2009-09-02T23:19:19.537 回答