2010-01-11 15 views
11

Mam problem, w którym tracę sesję PHP między 2 stronami.Zmiana ID sesji PHP między stronami

Funkcja session_start() jest zawarta w pliku o nazwie session-inc.php na każdej stronie wymagającej ustawienia sesji. Działa to dla wszystkich stron w witrynie, z wyjątkiem jednej konkretnej strony, member-profile.php. Po odwiedzeniu tej strony ustawiana jest nowa sesja z innym identyfikatorem (ta sama nazwa sesji), która jest używana.

kilka szczegółów:

  • nazwa sesji jest ustawiana ręcznie
  • Wszystkie strony są na tym samym serwerze pod tą samą nazwą domeny
  • jeśli mogę umieścić dodatkowy session_start() powyżej include ("session-inc.php") w pliku member-profile.php, sesja jest poprawnie przenoszona
  • Próbowałem ustawić session_cookie_domain i session.session_name w pliku .htaccess, działało to dla tej domeny, ale zatrzymało sesja została przekazana do domeny płatności
  • Jesteśmy apache 2.2.6 PHP 5.2.5

stawianie session_start() powyżej obejmują ('session-inc.php') w pliku członkiem-profile.php jest szybkie i Dirty fix dla tego problemu, ale zastanawiam się, czy ktoś wie, dlaczego tak się dzieje.

Cheers

Will

+0

Czy możesz opublikować zawartość pliku session-inc.php? Is include ("session-inc.php"); pierwszą rzeczą, którą robisz w member-profile.php? – Dominik

Odpowiedz

7

zgodnie z dokumentacją PHP session_start musi być wywoływana zanim jakiekolwiek dane zostaną wysłane z powrotem do browser-- mogłoby to strona ma Rogue CR/LF, znak Unicode kolejności bajtów lub podobne, które powoduje wyjście przed tobą include('session-inc.php')?

+0

Cześć Ken Sprawdziłem skrypty i nie ma żadnego wyjścia przed wywołaniem session_start(). – willl69

+0

+1 dla wskazówki oznaczenia bajtów w kodzie Unicode. Uratowałeś mój dzień! – AquilaRapax

0

wykryto problem

Było bom na początku główny zawiera plik z drugiej domeny. jak stwierdzono przez ken, nie ma żadnych danych wyjściowych przed rozpoczęciem sesji, to nie ustawianie sesji poprawnie.

2

Podczas migracji starszej witryny z PHP4 do PHP5 zauważyłem ustawienie konfiguracyjne php.ini, które powoduje, że php automatycznie uruchamia sesję po każdym żądaniu. Jest to alternatywa do umieszczania session_start() na każdej stronie ...

Istnieje wiele sposobów, aby włączyć to ustawienie:

Umieść następujący wiersz do pliku php.ini:

session.auto_start = on 

lub umieścić to do swojej apache config virtual-site lub plik .htaccess:

<IfModule mod_php5.c> 
    php_flag session.auto_start on 
</IfModule> 

i powinien uczynić $ _SESSION zmiany dostępny na wszystkich stronach

0

Problemem był znak kolejności bajtów (BOM), który został zastąpiony na początku pliku. Pozbyłem się go i rozwiązał problem z sesją.

2

Właśnie napotkałem ten problem. Interesujące jest to, że pomogło mi przeglądanie przez http://127.0.0.1 zamiast http://localhost.

0

ROZWIĄZANIE: session.auto_start = on w pliku php.ini:

To rozwiązało problem ponownego generowania identyfikatora sesji na przeładowanie strony (strony odświeżania strony/zmiany).

Problem pojawił się po aktualizacji CPanela (i zawierał Multi PHP), nawet wersja php pozostała taka sama.

Plik PHP.ini w ogóle nie zawierał tej zmiennej. Poszedłem na Cpanelu -> Edytor MultiPHP INI -> Tryb edytora (nie podstawowy, w wersji podstawowej nie masz tego ustawienia) i dodano linię. Naciśnij Zapisz.

WSKAZÓWKI/KIEDY UŻYWAĆ TEGO ROZWIĄZANIA: Aby ustalić, czy to jest problem, należy umieścić linię na samym początku i na końcu pliku index.php, aby sprawdzić identyfikator sesji. Użyj funkcji: session_id(); Przechodzenie między stronami/ponowne ładowanie strony. Jeśli wartość session_id ulegnie zmianie, problem nie występuje w kodzie, a to rozwiązanie powinno rozwiązać problem (sesja zostanie utracona poza kodem).

Próbowałem również zweryfikować dostępność sesji zapisu na serwerze WWW (session.save_path), ale nawet jeśli był to lead, tak nie było. Wyobrażam sobie, że jest to "funkcja" Cpanela z MULTIPHP UPDATE, która będzie się zdarzać dość często.

Powiązane problemy