2010-04-22 27 views
15

Tôi có ứng dụng iframe facebook với nhiều trang PHP trong đó.Ứng dụng khung nội tuyến Facebook có nhiều trang trong Biến thể phiên Safari không tồn tại

Tôi có một số liên kết trỏ đến tương đối với các tệp bên trong "thư mục iframe" của tôi.

Có một số vấn đề với biến phiên trong iframe. Tôi đặt một số biến phiên nhưng chúng không tồn tại từ trang này sang trang khác.

Tính năng này hoạt động trên các trình duyệt khác.

Tôi đã đọc rằng Safari không hỗ trợ cookie tên miền chéo và điều này có thể là vấn đề, nhưng tôi không chắc chắn cách sửa lỗi này.

Bất kỳ trợ giúp nào?

+0

Bạn có tìm thấy giải pháp nào không? – cdpnet

Trả lời

10

Tôi đã viết the blog post Dominic đề cập đến trong câu trả lời của mình.

Vấn đề là hành vi mặc định của Safari là chỉ chấp nhận cookie từ các trang web mà bạn truy cập. Điều này không bao gồm cookie "của bên thứ ba". Safari xử lý trang bên trong một IFRAME dưới dạng trang web của bên thứ ba và cho đến khi bạn tương tác với nội dung đó (bằng cách nhấp vào liên kết, ví dụ), nó sẽ từ chối các cookie đó.

Mã PHP của bạn cần đặt cookie trên trang đầu tiên sử dụng phiên để phiên đó tồn tại từ trang này sang trang khác, nhưng nếu biến phiên nằm trong trang đầu tiên trong IFRAME, bạn có một vấn đề về thịt gà và trứng.

Giải pháp của tôi là giữ lại tất cả thông số Facebook đặc biệt thông qua trang thứ hai được tải vào IFRAME. Vì bạn đã tương tác với nó, cookie được đặt trên trang thứ hai sẽ tiếp tục tồn tại và điều này cho phép mã PHP của bạn giữ bất kỳ trạng thái nào cần truyền lại cho Facebook.

Mặc dù vậy, điều này sẽ không giúp ích cho phiên PHP của bạn, vì vậy tôi đề xuất thêm thông số khác vào liên kết trên trang đầu tiên cho phép trang thứ hai xem xét phiên hoặc tạo lại.

+0

Steve, tôi đang sử dụng xác thực đăng nhập một lần trên facebook. Facebook đặt cookie cho miền được lưu trữ của tôi để cung cấp một lần đăng nhập. Nhưng, chính xác như bạn đã đề cập, safari sẽ từ chối nó. Và ứng dụng còn lại với vấn đề không có cookie từ facebook. Nếu tôi đã thiết lập cookie, đó là kịch bản khác nhau. – cdpnet

+0

Có thể bất kỳ ai xác nhận rằng giải pháp này không hoạt động trong các phiên bản Safari gần đây không? – Eydun

+2

Kỹ thuật này không hoạt động trong Safari 6 –

11

Tôi tin rằng giải pháp này đã trở nên lỗi thời với phiên bản mới nhất (6.0 trở lên) của Safari.

Safari theo mặc định không cho phép cookie được đặt từ bên thứ ba. Điều này ảnh hưởng đến ứng dụng khung nội tuyến Facebook vì người dùng đang truy cập trang được phân phối từ apps.facebook.com nhưng iframe đang được phân phát từ yourdomain.com, "bên thứ ba" trong trường hợp này.

Có một số giải pháp được đề cập trên web. Điều tốt nhất tôi đã tìm thấy và một khuyến nghị của Facebook trong danh sách miscellaneous issues là gửi yêu cầu POST đến yourdomain.com bằng cách sử dụng JQuery. Giải pháp này được chi tiết bởi Anant Garg hoạt động nói chung cho các miền máy chủ/iframe khác nhau và cần được điều chỉnh cho các ứng dụng Facebook. Các bộ phận chính là:

$("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(); 
    } 
} 

Một giải pháp khác bằng cách Will Henderson là đặt từng liên kết trên trang của bạn với thông tin phiên sử dụng hàm Javascript. Sau đó sửa đổi mã máy chủ của bạn để nắm bắt thông tin phiên này bằng cách đọc nó từ các tham số GET.

+3

không hoạt động Jonathan! –

+0

@ UğurÖzpınar Vâng, hiện không có truy vấn ngoại trừ việc chuyển phiên giữa các trang. Safari đã sửa lỗi POST POST bằng các vi phạm quyền riêng tư gần đây của Google. – kniteli

0

và cảm ơn tất cả các đầu vào. Tôi đã kết thúc giải quyết vấn đề bằng cách gắn thêm paramter "signed_request" trên mỗi trang. Tôi chỉ đặt nó vào như một lĩnh vực ẩn và đặt nó trong mã phía sau. Bằng cách đó, tôi đã làm cho nó hoạt động trong Safari. Hi vọng nó có ích cho bạn.

+0

Cảm ơn bạn đã trả lời câu trả lời này! Quá dễ! =) Nhưng kể từ khi câu trả lời này đã được downvoted rất nhiều, tôi tự hỏi những nhược điểm là gì? (Đoán tôi sẽ sớm tìm ra ...) –

+1

Bạn đã sử dụng tham số signed_request như thế nào? Có một ví dụ mã? Kỹ thuật này có hoạt động nữa không? –

0

Nếu bạn sử dụng .NET thì có một giải pháp đơn giản hơn nhiều cho vấn đề này.

Chỉ cần đặt cookieless thành false trong web.config của bạn. Ví dụ:

sessionState mode="InProc" cookieless="true" timeout="60" 

Dễ dàng hơn việc đăng iframe hoặc mở cửa sổ bật lên có url của iframe.

loại liên quan,

David

+1

Tôi có vấn đề tương tự với cookie của bên thứ 3 trong dự án của tôi. Nhưng giải pháp này không giúp tôi ... Tôi đã thử đặt cookieless thành false, UseUri, AutoDetected. Nhưng tôi nhận ngoại lệ.Có lẽ đây là lý do: "Khi bạn định cấu hình trang Web ASP.NET đã bật AJAX, chỉ sử dụng giá trị mặc định của UseCookies cho thuộc tính cookieless. Cài đặt sử dụng cookie được mã hóa trong URL không được ASP.NET AJAX hỗ trợ thư viện tập lệnh khách. " –

1

Tôi nghĩ rằng giải pháp tốt nhất là để tự theo dõi các session ID ví dụ bằng cách sử dụng session_id($_GET['session]); Chỉ cần chắc chắn rằng bạn làm điều này trước khi gọi session_start(); và mọi thứ hoạt động.

1

Safari chỉ chấp nhận cookie từ trang mà người dùng điều hướng đến. Cách dễ nhất và hiệu quả nhất để khắc phục điều này là chuyển hướng yêu cầu từ trang đích của ứng dụng canvas đến một trang khác trên miền của bạn bằng cách sử dụng top.location.href và chuyển hướng người dùng trở lại ứng dụng canvas từ trang đó.

Ví dụ: nếu abc.php là trang đích của bạn và URL canvas là facebook.com/abc. Đầu tiên chuyển hướng yêu cầu từ abc.php đến một trang khác như xyz.php rồi chuyển hướng lại từ xyz.php đến facebook.com/abc. Đừng quên bắt đầu phiên trong xyz.php.

Đây là việc sửa chữa đơn giản ...

-1

tôi sử dụng tiêu đề này với PHP, mà khắc phục vấn đề của tôi

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"'); 
0

Với việc phát hành Safari 7, không chỉ 3rd Party cookie được chặn. Lưu trữ cục bộ cũng như WebDB, bất kỳ loại dữ liệu trang web nào đang bị chặn. Khi bạn đi đến Tuỳ chọn Safari (CMD + dấu phẩy), Trong tab bảo mật, trên Safari 7, bây giờ nói: "Chặn cookie và trang web khác", ban đầu là "Chặn cookie". Điều đó xác nhận những thay đổi.

Các trình duyệt khác có thể theo dõi trong tương lai. Có lẽ hầu hết là Firefox. Chrome, ho * ho * có thể là không.

Bạn có thể phải sử dụng một số giải pháp thay thế bằng cách sử dụng kỹ thuật chuyển hướng hoặc cửa sổ bật lên tương tự như những gì disqus đã làm.

Các vấn đề liên quan