我有一個帶有多個PHP頁面的Facebook Iframe應用程序。Facebook的iframe應用程序在Safari會話中的多個頁面變量不會持續
我有一些鏈接指向我的「iframe文件夾」內的文件。
在iframe中遇到會話變量的一些問題。我設置了一些會話變量,但它們不會從一個頁面持續到另一個頁面。
這可以在其他瀏覽器上工作。
我一直在閱讀Safari不支持跨域cookie,這可能是問題,但我不知道如何解決這個問題。
任何幫助?
我有一個帶有多個PHP頁面的Facebook Iframe應用程序。Facebook的iframe應用程序在Safari會話中的多個頁面變量不會持續
我有一些鏈接指向我的「iframe文件夾」內的文件。
在iframe中遇到會話變量的一些問題。我設置了一些會話變量,但它們不會從一個頁面持續到另一個頁面。
這可以在其他瀏覽器上工作。
我一直在閱讀Safari不支持跨域cookie,這可能是問題,但我不知道如何解決這個問題。
任何幫助?
我寫了the blog post多米尼克在他的回答中提到。
問題是Safari的默認行爲是僅接受來自您訪問的網站的Cookie。這不包括「第三方」cookies。 Safari將IFRAME中的頁面視爲第三方網站,直到您與該內容交互(例如,通過單擊鏈接),它將拒絕這些cookie。
您的PHP代碼需要在使用會話的第一個頁面上設置一個cookie,以便該會話從一個頁面持續到另一個頁面,但是如果會話變量位於IFRAME的第一頁中,雞和雞蛋的問題。
我的解決方案是保留所有特殊的Facebook參數,直到加載到IFRAME的第二頁。因爲你已經和它交互了,所以在第二頁上設置的cookies將會持續存在,並且這可以讓你的PHP代碼保持與Facebook交流所需的任何狀態。
雖然這不會幫助你的PHP會話,所以我建議在第一頁上的鏈接添加另一個參數,允許第二頁查看會話或重新創建它。
我相信這個解決方案已經被Safari的最新版本(6.0和更高版本)所淘汰。
默認情況下,Safari不允許從第三方設置Cookie。這會影響Facebook的iframe應用程序,因爲用戶正在訪問從apps.facebook.com
提供的頁面,但iframe是從yourdomain.com
(這種情況下爲「第三方」)提供的。
在網絡上提到了幾種解決方案。我發現的最好的和Facebook推薦的miscellaneous issues列表中的一個是使用JQuery將POST請求僞造成yourdomain.com
。該解決方案由Anant Garg詳細描述,適用於不同的主機/ iframe域,需要適用於Facebook應用。關鍵的部分是:
$("body").append('
<iframe id="sessionframe" name="sessionframe" onload="submitSessionForm()" src="http://www.yourdomain.com/blank.php" style="display:none;"></iframe>
<form id="sessionform" enctype="application/x-www-form-urlencoded"
action="http://www.yourdomain.com/startsession.php"
target="sessionframe" method="post"></form>');
var firstTimeSession = 0;
function submitSessionForm() {
if (firstTimeSession == 0) {
firstTimeSession = 1;
$("#sessionform").submit();
}
}
通過Will Henderson另一種方法是用儀器使用JavaScript函數會話信息的頁面上的每個環節。然後修改您的服務器代碼以通過從GET參數中讀取會話信息來捕獲該會話信息。
不適用喬納森! – 2012-04-04 09:08:30
@UğurÖzpınar是的,除了通過頁面之間的會話之外,現在沒有辦法了。 Safari用最近的Google隱私侵犯慘敗修正了人造POST。 – kniteli 2012-04-06 00:22:18
並感謝所有的輸入。我通過在每個頁面上附加「signed_request」參數來解決問題。我只是把它作爲一個隱藏的領域,並將其置於代碼後面。這樣,我設法讓它在Safari中運行。希望它也適用於你。
謝謝你的回答!太簡單! =)但是由於這個答案已經被低估了很多,我不知道缺點是什麼? (猜猜我馬上就會知道......) – 2013-02-27 17:18:37
你是怎麼使用signed_request參數的?有代碼示例嗎?這種技術是否可以工作? – 2013-11-12 10:57:35
如果你使用.NET,那麼這個問題有一個更簡單的解決方案。
只需在web.config中將cookieless設置爲false即可。例如:
sessionState mode="InProc" cookieless="true" timeout="60"
它比發佈iframe或使用iframe的url打開彈出窗口要容易得多。
親切的問候,
大衛
我的項目中有第三方cookie的類似問題。但是這個解決方案並沒有幫助我...我嘗試將cookie設置爲false,UseUri,AutoDetected。但我接受異常。也許這是一個原因: 「當你配置一個支持AJAX的ASP.NET Web站點時,只使用UseCookies的默認值作爲cookieless屬性。ASP.NET AJAX不支持使用URL中編碼的cookie的設置客戶端腳本庫「。 – 2012-03-24 08:55:32
我認爲最好的辦法是打電話session_start();
之前手動跟蹤會話ID,即通過使用session_id($_GET['session]);
只要確保你做到這一點,一切正常。
Safari只接受來自用戶導航到的頁面的cookie。解決此問題的最簡單和最有效的方法是使用top.location.href
將您的畫布應用的着陸頁的請求重定向到您域中的其他頁面,並將用戶重定向到該頁面的畫布應用。
例如,如果abc.php是您的登錄頁面,並且畫布網址是facebook.com/abc。首先將請求從abc.php重定向到不同的頁面,如xyz.php,然後再從xyz.php重定向到facebook.com/abc。不要忘記在xyz.php中開始會話。
這是簡單的解決...
我用這個標題用PHP,即解決我的問題
if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE')) header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
使用Safari 7的發佈,不僅是第三方的cookie被阻止。本地存儲以及WebDB,任何類型的網站數據都被阻止。當您轉到Safari首選項(CMD +逗號),在Safari 7的隱私選項卡下,它現在說:「阻止Cookie 和其他網站」,最初是「阻止Cookie」。這證實了這些變化。
其他瀏覽器可能會在未來經歷。很可能是Firefox。鉻,咳嗽 *咳嗽*可能不是。
您可能不得不採用一些使用重定向技術的解決方法,或者彈出類似於disqus的方法。
您是否找到任何解決方案? – cdpnet 2010-07-09 22:55:03