好的,所以我通常會在app_data
字段signed_request
中提供數據來知道要加載哪個頁面。 POSTing時,處理有效負載後,我直接重定向到選項卡。
所以,有兩種方法可以請求一個頁面,即實際上是一個Facebook標籤:GET和POST。
GET
當使用GET,標籤應經常使用Facebook的URL請求。例如:該標籤的子頁面「form」應該有一個URL:http://www.facebook.com/pages/xXx/[page_id]?sk=app_[app_id] & app_data =表格
在您的服務器在解碼signed_request
(參見1和2)之後,您將識別app_data
中的數據。 在指向表單頁面的鏈接中,還必須添加target="parent"
屬性。 通過這個,Facebook重新加載和選項卡感覺比直接鏈接子頁面時慢。但是你有URL來標識子頁面,這是我們更喜歡的。 此外,您可以預計每個GET請求都有signed_request
。如果沒有,它不會通過Facebook調用,並且您可以顯示錯誤消息或我建議的重定向到您的選項卡(子頁面)。
POST
的POST從未有signed_request
。但通常,瀏覽時,瀏覽器使用GET請求。所以你可以假設,如果你收到一個POST請求,它可能來自你自己的形式或黑客攻擊的企圖。 在這兩種情況下,您都檢查該請求的有效性值。
如果他們是有效,您將它們保存到您的數據庫並重定向到「成功」頁面。例如。如果您打算參加比賽,則應顯示一張確保用戶已成功參加的頁面。
如果數據是無效,您將錯誤消息保存到會話中並重定向回顯示它們的表單。
我總是建議你在POST請求後重定向,不管你是否在Facebook選項卡中。但在Facebook標籤,重定向必須使用JavaScript,因爲它是一個IFRAME內完成,並且希望整個頁面重新加載:
<script type="text/javascript">
parent.location.href = 'http://www.facebook.com/pages/xXx/[page_id]?sk=app_[app_id]&app_data=form';
</script>
郵政scriptum 1:對於我來說,形式始終使用POST請求。
郵政scriptum 2:如果你不喜歡整個Facebook的「幀」重新加載每次點擊的想法,你能想到做一些AJAX魔術的這個請求是「五香」與額外的數據你承認他們是「你的」。
謝謝你的回答。確實有些非常有用的信息。我還無法找到解決這個問題的直接方法。基於會話的解決方案沒有幫助,因爲無論是否在iframe中,瀏覽器都提供相同的會話。這裏有一個類似的話題:http://stackoverflow.com/questions/7783786/how-to-know-if-my-page-is-running-in-a-bookbook-iframe-or-not – 2013-05-12 09:48:34
這是真的,但我的解決方案通過不依賴會話來避免這種情況 – 2013-05-13 02:21:50