在Safari

时间:2016-02-03 10:09:58

标签: javascript php cookies safari cross-domain

拥有两个网站:AB。我希望打开网站B的用户重新定向到其他网站(例如http://example.com),如果他们没有访问网站A

为此,我尝试在网站B上设置Cookie(只需加载网站A上的网页,设置Cookie)。打开网站B时,我会检查该Cookie。

除了Safari之外,这很好用。 Safari阻止在网站B上设置cookie。我搜索了很多,发现Safari默认阻止第三方cookie。

该问题的另一个解决方案可能是使用Referer标题(当点击网站A上的链接时,引用者将被发送到网站B) - 这对用户来说是失败的不想跟踪,他们禁用了引用标题。

这个问题是否有一个简单的解决方案,没有我们存储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">

1 个答案:

答案 0 :(得分:2)

这似乎是不可能实现的。 Safari仅接受用户导航的页面中的cookie。

2010年有一个相当狡猾的解决方法(source),但2013年及以后的评论表明它不再起作用了。到目前为止我尝试过这些东西:

  • 2010年的原始黑客(原创和一些变化)。
  • 通过以iFrame为目标的post-form-element请求页面。
  • 通过...加载初始化会话的脚本(设置cookie)
    • IMG标签
    • 脚本标签
    • 通过jquery进行AJAX调用

一切都没有成功。我发现即使谷歌地图和分析也不会在Safari中设置任何cookie。

有可能通过链接加载页面来规避问题,在此之后立即设置cookie,并使用嵌入的iFrame重定向到页面。我没有测试过这种方法,但因为它不能满足我们对可用性和美学的需求。当通过深层链接访问带有iFrame的页面时,请谨慎使用此功能!