Tôi tin article'll này có ích: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/
Câu trả lời ngắn gọn là: trong iframe, bắt đầu phiên như thế này:
header('P3P: CP="CAO PSA OUR"');
session_start();
EDIT:
tưởng Tôi nên cập nhật câu trả lời này, vì tôi tình cờ gặp một điều thú vị mà mọi người nên biết.
Tiêu đề p3p hack không hoạt động trên safari.
Dưới đây tôi mô tả luồng đăng nhập của mình và cách tôi giải quyết vấn đề này.
luồng đăng nhập của tôi trông như thế này (ứng dụng trang):
- kiểm tra nếu người dùng hiện nay có một phiên giao dịch,
- nếu không, chuyển hướng đến url đăng nhập (được tạo ra bởi PHP SDK),
- hộp thoại đăng nhập chuyển hướng trở lại url, nơi tôi sử dụng 'mã' tham số GET facebook cung cấp cho tôi, để nhận mã thông báo truy cập, mà tôi có thể lưu trữ để sử dụng sau này. (Lưu vào DB và cho phiên.) Nếu tôi làm xong, tôi chuyển hướng người dùng đến ứng dụng trang của tôi, nơi mọi thứ sẽ hoạt động.
- mọi người sẽ vui vẻ vào thời điểm này.
NHƯNG tại đây có hình ảnh xác thực.
Nếu người dùng sử dụng safari, và cố gắng để mở ứng dụng này khi phiên đã bị phá hủy (. Vài ngày sau cho ex), những điều sau đây sẽ xảy ra:
- sẽ kiểm tra mã cho một phiên : nó tìm thấy ID người dùng (phương thức getUser() của PHP SDK), vì vậy trước tiên tôi kiểm tra một mục nhập trong cơ sở dữ liệu.
- Kể từ khi người dùng đăng nhập trước, anh ta có một mục trong cơ sở dữ liệu, vì vậy tôi chỉ lấy nó và lưu nó vào một phiên, để các cuộc gọi AJAX trong tương lai sẽ có tất cả thông tin họ cần.
Điều quan trọng cần lưu ý ở đây là mã này chạy trong tab trang trong iframe.
Vì vậy, đối với hầu hết người dùng, mã sẽ hoạt động vì mục tiêu tiêu đề p3p.
Nhưng đối với người dùng safari thì không.
Safari không quan tâm đến tiêu đề nhất định, từ chối lưu phiên, do đó người dùng đăng nhập vào ứng dụng, mọi thứ có vẻ hoạt động tốt, nhưng cuộc gọi ajax sẽ không hoạt động, vì họ đã thắng t có bất kỳ phiên làm việc với.
Cách giải quyết:
Khá đơn giản thực sự - Mặc dù không phải là quá tao nhã, nhưng hey, nó hoạt động. -: Tôi kiểm tra xem trình duyệt của khách hàng có đang safari hay không, và nếu có, tôi chuyển hướng đến url tùy chỉnh, nơi tôi bắt đầu phiên - bên ngoài khung nội tuyến facebook -, sau đó chuyển hướng quay lại ứng dụng.
Thao tác này sẽ tạo cookie mà không gặp sự cố, do đó các phiên sẽ khả dụng.
Ở đây, có một số mã:
Kiểm tra phiên (Credit goes to this guy)
if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) {
if (count($_COOKIE) === 0) {
echo '<script>
top.location = "http://www.domain.com/setcookie.php";
</script>';
}
}
thiết lập phiên (setcookie.php)
header('P3P: CP="CAO PSA OUR"');
session_start();
$_SESSION = array();
echo
'<script>
top.location = "http://back-to-the-facebook-app.com";
</script>';
Tôi hy vọng mẹo bổ sung này sẽ giúp người khác.
EDIT2
Tôi không thử một này ra chưa, nhưng thay vì thêm header P3P, bạn chỉ có thể thêm những dòng sau vào.htaccess:
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>
Với nhận xét:
# ------------------------------------------------------------------------------
# | Cookie setting from iframes |
# ------------------------------------------------------------------------------
# Allow cookies to be set from iframes in IE.
# http://msdn.microsoft.com/en-us/library/ms537343.aspx
# http://www.w3.org/TR/2000/CR-P3P-20001215/
<IfModule mod_headers.c>
Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
</IfModule>
Tất cả tín dụng đi cho điều này .htacces mã cho những kẻ đằng sau dự án Yeoman.
nếu bạn có session_start() trên trang iframe, bạn sẽ không gặp vấn đề gì. – Chibuzo
Tôi gặp sự cố với các phiên dựa trên cookie không hoạt động trong khung nội tuyến của mình. Đó là vì trình duyệt mà tôi đã thử nghiệm có ** cookie của bên thứ ba ** bị tắt. –