PHP 中的 AWS Cloudfront SetCookie

AWS Cloudfront SetCookie in PHP

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

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html

他们举了一个例子 cookie header:

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。只有我取出域名才设置cookie。

我认为这是因为在 session_start 之后在脚本中调用了 setcookie。我尝试添加这个,但它在 session_start()

之前是必需的
session_set_cookie_params(0, '/', 'duvoxso6rm38g.cloudfront.net);

我需要做这样的事情吗?

//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。出于安全原因,浏览器会默默地忽略它。这是一个浏览器功能,不是 PHP 东西。

如果您想将已签名的 cookie 与 CloudFront 一起使用,您需要为作为您 PHP 服务器域的子域的 CloudFront 分配使用 CNAME。可以在下面找到更详细的答案:https://mnm.at/markus/2015/04/05/serving-private-content-through-cloudfront-using-signed-cookies/

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

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