PHP中的AWS Cloudfront SetCookie

PHP中的AWS Cloudfront SetCookie,php,cookies,amazon-web-services,amazon-cloudfront,Php,Cookies,Amazon Web Services,Amazon Cloudfront,我正在尝试设置cookie以从AWS Cloudfront查看私有内容 他们给出了一个cookie头的示例: Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE 我创建了以下php代码 setcookie ( 'CloudFront-Key-Pair Id', 'MYID', 0, '/',

我正在尝试设置cookie以从AWS Cloudfront查看私有内容

他们给出了一个cookie头的示例:

Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE
我创建了以下php代码

setcookie (
  'CloudFront-Key-Pair Id',
  'MYID',
  0,
  '/',
  'mycloudfrontsub.cloudfront.net',
  true, 
  true
);
但曲奇并没有设定好。只有当我取出域名时,才会设置cookie

我认为这是由于在会话启动后在脚本中调用setcookie造成的。我尝试添加此项,但在会话_start()之前需要此项

我需要这样做吗

//close local session, then open new one for aws
$id=SID;
session_write_close();
session_set_cookie_params(0, '/', 'mysub.cloudfront.net');
session_start();
setcookie(...);
session_write_close();
session_set_cookie_params(0, '/', 'originaldomain.com');    
session_start();

cookie不会显示在浏览器中,因为您从域B发送了域a的cookie。出于安全原因,浏览器会自动忽略该cookie。这是一个浏览器功能,不是PHP的东西

如果要将签名cookie与CloudFront一起使用,则需要为CloudFront发行版使用CNAME,该发行版是PHP服务器域的子域。有关更详细的答案,请参见:

简而言之:假设您想使用域example.com。您可以在www.example.com下提供PHP文件。然后,您可以将CNAMEmedia.example.com用于d111111abcdef8.cloudfront.net。要将Cookie从PHP端发送到CloudFront服务器,您需要在Cookie中使用域example.com


引用的站点也注意到,您应该使用PHP函数header()来发送cookie,而不是setcookie()。这是因为setcookie函数进行了一些编码,破坏了使用站点上提到的函数创建的参数

您正在设置自定义cookie,所以它与会话cookie无关,而且您的setcookie代码似乎正确。我从未在浏览器中出现过。我发现另一篇帖子说,由于安全问题,PHP不允许这样做。我改成了有签名的URL。有道理。我没有测试它,而是使用了签名URL。谢谢
//close local session, then open new one for aws
$id=SID;
session_write_close();
session_set_cookie_params(0, '/', 'mysub.cloudfront.net');
session_start();
setcookie(...);
session_write_close();
session_set_cookie_params(0, '/', 'originaldomain.com');    
session_start();