Поместите этот JavaScript на страницу, выполняющую междоменные запросы, http://example1.com/index.html:
<script>
var gup = function(name, url) {
if(!url) url = location.href;
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( url );
return results == null ? null : results[1];
}
var isSafari = navigator.vendor && navigator.vendor.indexOf('Apple') > -1 && navigator.userAgent && !navigator.userAgent.match('CriOS');
var n = gup("activated");
if(isSafari && n == null) {
//browser is Safari and cookies have not yet been activated
var current_url = location.protocol + '//' + location.host + location.pathname;
var query_string = '?callback=' + encodeURIComponent(current_url + '?activated=1');
var new_url = 'http://example2.com/activate.php' + query_string;
window.location.href = new_url;
}
//the rest of your code goes here, and you can now set cross-domain cookies on Safari
</script>
Затем создайте файл на другом сервере, для которого нужно установить куки, http://example2.com/activate.php:
<?php
if(isset($_GET['callback'])) {
header('Location: '.$_GET['callback']);
exit();
} else {
//in case callback param is not set, simply go back to previous page
echo "<script>";
echo "window.history.back();";
echo "</script>";
exit();
}
?>
Вот как это работает:
При первом посещении http://example1.com/index.html выполняется проверка, чтобы определить, является ли браузер Safari и не существует GET-параметра с именем «активировано». Если оба условия выполнены (что произойдет при первом посещении браузера Safari), то браузер будет перенаправлен на http://example2.com/activate.php с параметром GET «callback», содержащим URL-адрес вызывающего абонента, добавленный с «активированным» параметр.
http://example2.com/activate.php просто перенаправляет обратно на URL-адрес, содержащийся в параметре GET, «обратный вызов».
Когда http://example1.index.html теперь нажимается во второй раз после перенаправления на, теперь будет установлен параметр GET, «активирован», поэтому условие с шага 1 не будет выполнено, что позволяет скрипт для продолжения выполнения.
Это соответствует требованию Safari о том, чтобы браузер хотя бы раз посещал сторонний домен, чтобы начать установку файлов cookie.