سؤال

إيفرنوت's المختصر هو قادرة على القيام بذلك ، ولذلك فإن معظم upvoted الجواب لا يجيب هذا على الرغم من أن الجائزة سوف تذهب إلى ذلك (في غير منتجة الطريقة).

يجب أن أتصل المجال A.com (الذي يضع ملفات تعريف الارتباط مع http) من المجال B.com.كل ما أفعله في المجال B.com هو (جافا سكريبت):

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "A.com/setCookie?cache=1231213123";
head.appendChild(script);

هذا يضع ملفات تعريف الارتباط على A.com على كل متصفح لقد اختبرت عدا سفاري.مذهل هذا يعمل في IE6 ، حتى من دون P3P رؤوس.

هل هناك أي طريقة لجعل هذا العمل في سفاري ؟

هل كانت مفيدة؟

المحلول

من Safari Developer FAQ:

سفاري السفن مع المحافظ سياسة ملفات تعريف الارتباط مما يحد من الكعكة يكتب فقط الصفحات المختارة ("الانتقال إلى") من قبل المستخدم.هذا الافتراضي سياسة المحافظين قد تخلط الإطار على أساس المواقع التي تحاول كتابة الكوكيز و تفشل.

لقد وجدت أي وسيلة للالتفاف حول هذا.

اذا كان يستحق أي شيء ، كروم لا تعيين ملفات تعريف الارتباط إما إذا كنت تستخدم <script> إلحاق الأسلوب ، ولكن إذا كان لديك مخفية <img> مع نفس المصدر ، كروم يعمل بالإضافة إلى بقية المتصفحات (باستثناء مرة أخرى, سفاري)

نصائح أخرى

هنا هو الحل الذي يعمل:

http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari/

طريقة العمل 2014-2016:

عليك أن تفعل النافذة.فتح المجال / تعيين ملف تعريف الارتباط / إغلاق النوافذ المنبثقة ، المجال الآن safelisted.

المشاركة الأصلية @ PHP عدة ملفات تعريف الارتباط لا يعمل على باد / اي فون المتصفح

هناك قليلا من شر خدعة على افتراض أنها لديك فلاش تركيب.

لست متأكدا إذا كان لا يزال يعمل أو لا ، ولكن فلاش وفاق "الكائنات المحلية المشتركة" الملقب فلاش الكوكيز يمكن أن تساعدك على الإبحار حول سفاري نفس نهج المجال.

المشتركة المحلية الكائن التعليمي

ومع ذلك ، قد يكون من الصعب تنفيذها ، على أقل تقدير.

أديتونالي ، ليسوتو هي نازلة في ضوء كونه كابوسا أمنيا:

لذلك فكر جيدا قبل استخدامها.

وظيفة خفية <iframe> يمكن أن تسمح لك عن طريق تمرير هذا التقييد في سفاري -- http://gist.github.com/586182:

<?php
  header('P3P: CP=HONK');
  setcookie('test_cookie', '1', 0, '/');
?>
<div id="test_cookie" style="position: absolute; top: -10000px"></div>
<script>
  window.setTimeout(function() {
    if (document.cookie.indexOf('test_cookie=1') < 0) {
      var      
        name = 'test_cookie',
        div = document.getElementById(name),
        iframe = document.createElement('iframe'),
        form = document.createElement('form');

      iframe.name = name;
      iframe.src = 'javascript:false';
      div.appendChild(iframe);

      form.action = location.toString();
      form.method = 'POST';
      form.target = name;
      div.appendChild(form);

      form.submit();
    }
  }, 10);
</script>

هناك الحل السليم لهذا العمل في عام 2015.دعنا نقول أن هناك موقع y.com والتي تشمل iframe مع الموقع x.com.على x.com iframe تريد تخزين ملف تعريف الارتباط.التي لا يسمح بها سفاري السياسة ، ومع ذلك ، y.com هو قادرا على تخزينها.لذلك y.com يجب الاستماع إلى الرسائل من x.com ثم متجر الكعكة نفسها.

var _cookieEvMth = window.addEventListener ? "addEventListener" : "attachEvent";
var _cookieEvAction = window[_cookieEvMth];
var _cookieEv = _cookieEvMth == "attachEvent" ? "onmessage" : "message";
_cookieEvAction(_cookieEv, function(evt){
  if(evt.data.indexOf('cookieset')!=-1){
    var datack = evt.data.split('|');
    YOUR_CUSTOM_COOKIE_SAVE_METHOD(datack[1],datack[2],datack[3]);
  }
},false);

عندما x.com يحتاج إلى تخزين ملف تعريف الارتباط ، يجب أن آخر رسالة y.com:

window.parent.postMessage('cookieset|'+ckName+'|'+ckVal+'|'+days,'*');

كما يمكنك العمل طريقك إلى آخر رسالة إلى iframe إذا كنت ترغب في قراءة ملف تعريف الارتباط.أو يمكنك تضمين أنها معلمة في x.com iframe url باستخدام جافا سكريبت:

iframe.setAttribute('url','x.com/?cookieval='+YOUR_COOKIE_GET_METHOD('cookiename'));

الحل نحن فقط جاء في عملي كان تعيين ملف تعريف الارتباط عبر النافذة.فتح() - قد لا يكون الأمثل بالنسبة لك (كما سيكون لديك قبيحة الحمار نافذة منبثقة فتح) ، لكنها عملت بشكل جيد بالنسبة لنا.كان علينا أن يكون نافذة مفتوحة على أية حال مصادقة OAuth.

حتى jist ما فعلناه هو:

  1. ينقر المستخدم على الرابط من B.com
  2. نافذة منبثقة يفتح A.com/setCookie
  3. A.com يحدد الكعكة ثم الموجهات إلى B.com في المكان المناسب

مرة أخرى, غير صالحة في جميع الحلول, لكنه يعمل في بلدنا.ويساعد هذا الأمل.

أعرف أن هذا السؤال هي قديمة نوعا ما ، ولكن هذا ساعدني على حل مشكلة الكوكيز:

var cookieForm = document.createElement("form");
cookieForm.action = "A.com/setCookie?cache=1231213123";
cookieForm.method = "post";
document.body.appendChild(cookieForm);

cookieForm.submit();

فكرة لجعل شكل آخر على الصفحة التي تضع ملفات تعريف الارتباط الخاصة بك.

*تحرير* هذا الحل تم الإبلاغ عن مغلقة في بكت.

لوكا ،

حسنا ، هذا الجواب سنتين من العمر ، ولكن...يمكنك تعيين ملف تعريف الارتباط من iframe إذا قمت بنشر النموذج خفية iframe.يمكنك القيام بذلك عن طريق إنشاء نموذج:

<form id="myiframe" action="http://yourdomain.com" method="POST" target="iframe_target">

ثم في جافا سكريبت ، الحصول على مرجع إلى نموذج اتصل تقديم:

document.getElementsByTagName('form')[0].submit();

يمكنك الاستماع إلى iframe هو onload ، أو هل يمكن أن يكون الخاصة بك iframe عمل صفحة قضية بعض جافا سكريبت أن إشارات الحمل.لقد اختبرت هذا في سفاري و كروم و يعمل.

الهتافات.

وهذا قد لا تعمل من أجل الجميع ، ولكن جئت عبر هذا الموضوع لأنني كنت تخدم تتفاعل التطبيق من مختلف المضيف من API و الحل في نهاية المطاف عملت استخدام DNS:

عميلنا كانت تقدم من www.company-name.com لدينا API على company-name.herokuapp.com.من خلال جعل CNAME سجل api.company-name.com --> company-name.herokuapp.com وبعد عملائنا استخدام فرعي مكالمات API, سفاري توقفت معتبرا انها "طرف ثالث" كوكي.

الاتجاه الصعودي هو أن هناك القليل جدا من رمز المشاركة ، وكل ذلك باستخدام راسخة الاشياء...الجانب السلبي هو أن كنت بحاجة إلى بعض التحكم/ملكية API المضيف إذا كنت تنوي استخدام https يحتاجون شهادة صالحة لمدة العميل المجال أو المستخدمين سوف تحصل على شهادة تحذير - حتى هذا لن تعمل (على الأقل ليس من أجل شيء نهاية التي تواجه المستخدم) إذا API في مسألة ليس لك أو شريك حياتك.

ربما عمليا إنشاء ثم انقر فوق ارتباط مع href="A.com/setCookie?cache=1231213123" و السمة الهدف مشيرا إلى iframe مخفي.أن قد تجاوز سفاري سياسة المستخدم التنقل من أجل إعداد ملفات تعريف الارتباط (ليس لدي سفاري مفيد لاختبار.)

فعلت بعض تحقيقات موسعة حول هذا عندما كنت أحاول أن نشر أحد المواقع التي تستخدم نظام التشغيل Windows Live ID الذي يعتمد على القدرة على أن تكون قادرة على تعيين 3rd الطرف ملفات تعريف الارتباط من أجل تسجيل الخروج.إنه فقط...لم ينجح.لا شيء نستطيع أن نفعله هو الحصول على عمل.Live ID الفريق كما فعل واسعة التحقيق و الإجابة كانت "لا يمكن أن تجعل من العمل".

ملاحظة هذا السطر:

script.src = "A.com/setCookie?cache=1231213123";

أنا لا يمكن الحصول على هذا العمل حتى أضفت http ، أي

script.src = "http://A.com/setCookie?cache=1231213123";

لقد وجدت حل بسيط.تحتاج فقط لأول مرة إعداد الكعكة للتحقق مما إذا كان طلب تأتي من نفس الأصل أو لا ، إن لم يكن كالعادة كنت بحاجة إلى العودة إلى iframe السيناريو الذي سوف أكرر هذا الطلب بالفعل وجود إذن تعيين ملف تعريف الارتباط.بعد ذلك يمكنك أن تفعل غيرها من الطلب مباشرة من خلال iframe الوصول إلى ملف تعريف الارتباط هذا.هذا ساعدني في نظام تتبع.حاول هذا يعمل بشكل جيد.

من الجدير بالذكر أن هذا التقييد في سفاري لا تنطبق في جميع المجالات الفرعية.حتى إذا كنت مباشرة زيارة sitea.com ثم يمكنك تعيين ملفات تعريف الارتباط من subdomain.sitea.com من دون تفاعل المستخدم (iframe/جافا سكريبت).

كان هذا هو ذات الصلة حالتي عند وضع API.إذا كنت الزوار يصلون في mysite.com ثم كنت تريد بعض جافا سكريبت للتفاعل مع API الخاص بك ، ثم إذا API استضافتها في api.mysite.com ثم أنه سوف يعمل على سفاري.

هذا سكريبت على الصفحة صنع عبر المجال الطلبات ، 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();
  }
  ?>

هنا كيف يعمل هذا:

  1. عندما http://example1.com/index.html هو أول من زار يتم التحقق لمعرفة ما إذا كان متصفح سفاري و إذا كان على المعلمة اسم "تنشيط" لا وجود لها.إذا كانت كل الشروط (الذي سوف يحدث في أول زيارة على متصفح سفاري) ، ثم يتم إعادة توجيه المتصفح إلى http://example2.com/activate.php مع الحصول على المعلمة "الاستدعاء" ، تتضمن الدعوة URL المرفقة مع "تفعيل" المعلمة.

  2. http://example2.com/activate.php ببساطة إعادة توجيه إلى URL الواردة في الحصول على المعلمة "الاستدعاء".

  3. عندما http://example1.index.html الآن ضرب هذه المرة الثانية بعد أن توجيهك إلى ، على المعلمة "تنشيط" سيتم الآن مجموعة ، وذلك مشروط من الخطوة 1 سوف يتم تنفيذه ، مما يسمح البرنامج النصي لمتابعة التنفيذ.

هذا يفي سفاري شرط وجود متصفح زيارة 3rd الطرف المجال على الأقل مرة واحدة من أجل البدء في إعداد ملفات تعريف الارتباط.

محاولة شيء من هذا القبيل:

var w = window.open("A.com/setCookie?cache=1231213123");
w.close();

قد تجاوز سفاري السياسة الأمنية.

لم يكن في عداد المفقودين نوع سمة هذا مزعج لك؟)

<script type="text/javascript">
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.setAttribute("type","text/javascript");
  script.src = "A.com/setCookie?cache=1231213123";
  head.appendChild(script);
</script>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top