2012-02-16 40 views
5

Tôi đã cố gắng duy trì các phiên vars giữa hai tên miền phụ và thấy rằng nó không thể. Tôi đã kết thúc việc tạo ra 2 trang web PHP tối thiểu như một chiếc giường kiểm tra, một tôi gọi 'test 1' chỉ đặtDuy trì các biến phiên trên các tên miền phụ

$_SESSION['test'] = "Fred"; 

và có một siêu liên kết đến 'test 2' mà chỉ đơn giản cố gắng để echo giá trị của $ _SESSION [ 'test'] để chứng minh nó hoạt động, hay không. Tôi đặt 'test 1' trong miền www của tôi và 'test 2' trong tên miền phụ của tôi. Tôi thử phiên bản khác nhau của những gì nên đi trong tiêu đề, từ nhiều nguồn khác nhau. Sau đây là các chính 3 (và dĩ nhiên là biến thể của họ):

ini_set('session.cookie_domain',substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
session_start(); 

hoặc

ini_set('session.cookie_domain','mydomain.com'); 
session_start(); 

hoặc

ini_set('session.cookie_domain', PHP_INI_ALL); 
session_start(); 

hoặc

session_set_cookie_params(0, "/", ".mydomain.com", false); 
session_start(); 

tôi thấy rằng tôi nhận được một kết quả giống nhau trong mọi trường hợp. Phiên không được thực hiện trên các tên miền phụ và thử nghiệm trang 2 không có ý tưởng giá trị tôi đặt $ _SESSION ['test']. Tuy nhiên, có vẻ như có rất nhiều sự chắc chắn xung quanh 'net rằng một trong những phương pháp trên nên hoạt động. Bất kỳ ý tưởng những gì có thể xảy ra, đặc biệt là kể từ khi tôi đang sử dụng các trang tối thiểu để kiểm tra cơ chế (không có tác dụng phụ mà tôi có thể nhìn thấy)? Bằng cách này tôi đang ở trên một máy chủ chia sẻ, nếu đó là pertinant ở đây.

Cảm ơn bạn đã suy nghĩ. Frank.

Chỉnh sửa. Tôi đã sửa nó. Vấn đề là do Suhosin gây ra. Xem câu trả lời chi tiết ở chân trang này.

Trả lời

5

Ok tôi đóng đinh nó và đó là một người có mùi thúi.

Tùy chọn suhosin.session.cryptdocroot của Suhosin là toàn bộ nguyên nhân của sự cố. Khi khóa mã hóa phiên được dựa trên DocRoot nó làm cho các tên miền phụ không nhìn thấy các biến phiên của nhau khi tên miền cơ sở và các tên miền phụ được phục vụ từ các thư mục khác nhau. Điều này dẫn đến các phiên vars trên máy chủ đang được lưu trữ trong các thư mục khác nhau và do đó chúng không hiển thị cho mỗi miền tương ứng.

Giải pháp. Chỉ cần thêm 2 dòng này vào tệp php.ini của bạn:

suhosin.session.cryptdocroot=Off 
suhosin.cookie.cryptdocroot=Off 

Một cơn ác mộng 48 giờ để theo dõi, 4,8 giây để khắc phục.

+0

"Một cơn ác mộng 48 giờ để theo dõi xuống, 4,8 giây để sửa chữa" - siêu. Tôi hiểu bạn :) – qasanov

0

Tôi có nó làm việc, thiết lập một tên phiên và cookie phiên tham số:

$some_name = session_name("some_name"); 
session_set_cookie_params(0, '/', '.some_domain.com'); 
session_start(); 
+0

Cảm ơn. Tôi đã thử đặt tên phiên - không có niềm vui. Bây giờ tôi có thêm thông tin. Tôi đã thử một bài kiểm tra được đề xuất trong tài liệu tại php.net và thêm vào những điều sau: $ some_name = session_name ("some_name"); $ blnResult = ini_set ("session.cookie_domain", ".mydomain.com"); session_start(); nếu (trống ($ blnResult) hoặc (! $ blnResult)) thiết lập {echo "không thể được thiết lập"; lối thoát; } Tôi thấy kết quả trả về cho biết nó không được thiết lập! Bất kỳ ý tưởng nào tại sao phải như vậy? – Frankie

+0

@Frank Anderson Tôi chưa thử phương thức 'ini_set', chỉ là' session_set_cookie_params'. – jeroen

+0

Cảm ơn jeroen. Tôi đã thực hiện một sai lầm vụng về tôi nhìn thấy nhưng bây giờ tôi đã sửa chữa điều đó và có tôi đã sử dụng các thiết lập chính xác như bạn đề nghị ở đây.Giá trị của Biến phiên không được chuyển sang trang 'nhận', miễn là nó nằm trong tên miền phụ. Nó có thể là gì khác, hoặc những chẩn đoán nào khác mà tôi có thể cố gắng tìm ra những gì đang xảy ra? – Frankie

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