在 Safari 上设置 cross-site cookie
Setting cross-site cookie on Safari
有两个网站:A
和 B
。我希望打开网站 B
的用户在 没有 访问网站 A
时被重定向到另一个网站(例如 http://example.com
) .
为此,我尝试在网站 B
上设置一个 cookie(只需在网站 A
上加载一个页面,设置 cookie)。打开网站时 B
我检查那个 cookie。
这很好用,但在 Safari 上除外。 Safari 阻止在网站 B
上设置 cookie。我搜索了很多,发现 Safari 默认情况下会阻止 third-party cookie。
该问题的另一种解决方案是使用 Referer
header(当单击网站 A
上的 link 时,引用将被发送到网站 B
)——这对于不想被跟踪的用户来说是失败的,他们禁用了引用 header.
这个问题有没有简单的解决方案,没有我们存储 ips 或类似东西的数据库?
这是我目前拥有的代码:
Website B index.php
:
<?php
$cookie_name = "visited_first_website";
if(isset($_COOKIE[$cookie_name]) ) {
echo "Visited";
} else {
$newURL = "https://example.com";
header('Location: '.$newURL);
}
?>
这是网站 A 上的 运行,使用 B/set-cookie.js
。
window.addEventListener("DOMContentLoaded", function () {
var iframe = document.createElement("iframe");
//iframe.style.display = "none";
var scripts = document.getElementsByTagName("script");
var src = scripts[scripts.length - 1].src;
var websiteBAddress = src.match(new RegExp("https?://[^/]*"))[0];
iframe.setAttribute("src", websiteBAddress + "/js/embed.php");
document.body.appendChild(iframe);
});
embed.php
文件如下所示:
<?php
$cookie_name = "visited_first_website";
$cookie_value = time();
setcookie($cookie_name, $cookie_value, time() + (86400 * 2), "/"); // 86400 = 1 day
header('Access-Control-Allow-Origin: *');
?>
<!DOCTYPE html>
<html>
<body>
</body>
</html>
那么,解决这个问题最简单的工作流程是什么?
我也试过加载图片标签,但没成功:
<img src="B/js/embed.php">
这似乎是不可能实现的。 Safari 只接受来自用户 导航 到 him-/herself.
的页面的 cookie
早在 2010 年 (source) 就有一个相当老套的解决方法,但 2013 年及之后的评论指出它不再有效。到目前为止我尝试了这些东西:
- 2010 年的原创黑客(原创和一些变体)。
- 通过以 iFrame 作为目标的 post 表单元素请求页面。
- 加载初始化会话(设置 cookie)的脚本...
- img-标签
- 脚本标签
- AJAX-通过jquery
调用
都没有成功。我发现即使 google 地图和分析也不会在 Safari 中设置任何 cookie。
可能可以通过 link 加载页面来规避此问题,该页面设置 cookie,然后立即重定向到具有嵌入式 iFrame 的页面。我没有测试这种方法,因为它不能满足我们对可用性和美学的需求。当带有 iFrame 的页面可以通过 deep link!
访问时,请谨慎使用它
有两个网站:A
和 B
。我希望打开网站 B
的用户在 没有 访问网站 A
时被重定向到另一个网站(例如 http://example.com
) .
为此,我尝试在网站 B
上设置一个 cookie(只需在网站 A
上加载一个页面,设置 cookie)。打开网站时 B
我检查那个 cookie。
这很好用,但在 Safari 上除外。 Safari 阻止在网站 B
上设置 cookie。我搜索了很多,发现 Safari 默认情况下会阻止 third-party cookie。
该问题的另一种解决方案是使用 Referer
header(当单击网站 A
上的 link 时,引用将被发送到网站 B
)——这对于不想被跟踪的用户来说是失败的,他们禁用了引用 header.
这个问题有没有简单的解决方案,没有我们存储 ips 或类似东西的数据库?
这是我目前拥有的代码:
Website B index.php
:
<?php
$cookie_name = "visited_first_website";
if(isset($_COOKIE[$cookie_name]) ) {
echo "Visited";
} else {
$newURL = "https://example.com";
header('Location: '.$newURL);
}
?>
这是网站 A 上的 运行,使用 B/set-cookie.js
。
window.addEventListener("DOMContentLoaded", function () {
var iframe = document.createElement("iframe");
//iframe.style.display = "none";
var scripts = document.getElementsByTagName("script");
var src = scripts[scripts.length - 1].src;
var websiteBAddress = src.match(new RegExp("https?://[^/]*"))[0];
iframe.setAttribute("src", websiteBAddress + "/js/embed.php");
document.body.appendChild(iframe);
});
embed.php
文件如下所示:
<?php
$cookie_name = "visited_first_website";
$cookie_value = time();
setcookie($cookie_name, $cookie_value, time() + (86400 * 2), "/"); // 86400 = 1 day
header('Access-Control-Allow-Origin: *');
?>
<!DOCTYPE html>
<html>
<body>
</body>
</html>
那么,解决这个问题最简单的工作流程是什么?
我也试过加载图片标签,但没成功:
<img src="B/js/embed.php">
这似乎是不可能实现的。 Safari 只接受来自用户 导航 到 him-/herself.
的页面的 cookie早在 2010 年 (source) 就有一个相当老套的解决方法,但 2013 年及之后的评论指出它不再有效。到目前为止我尝试了这些东西:
- 2010 年的原创黑客(原创和一些变体)。
- 通过以 iFrame 作为目标的 post 表单元素请求页面。
- 加载初始化会话(设置 cookie)的脚本...
- img-标签
- 脚本标签
- AJAX-通过jquery 调用
都没有成功。我发现即使 google 地图和分析也不会在 Safari 中设置任何 cookie。
可能可以通过 link 加载页面来规避此问题,该页面设置 cookie,然后立即重定向到具有嵌入式 iFrame 的页面。我没有测试这种方法,因为它不能满足我们对可用性和美学的需求。当带有 iFrame 的页面可以通过 deep link!
访问时,请谨慎使用它