Olen pitkään painunut semmoisen ongelman kanssa, että minulla on PHP framework Yii käytössä, jonka päälle teen login järjestelmän. Login onnistuu suurissa osissa tapahtumia moitteetta, mutta joskus välimuisti tai jokin vastaava aiheuttaa sen, että loggaukseen jälkeen session ikään kuin katoaa. Eli käyttäjänimi ja salasana hyväksytään ja loggaus onnistuu, mutta heti uuden redirectin jälkeen kaikki on kadonnut.
Osaisko joku antaa vinkkiä, että miten mun kannattais lähtee ratkoo probleemaa. Ongelmaa ei ole aiemmin ollut, mutta mahdollisesti joko uusien selainpäivitysten tai Yii päivitysten takia se on ilmestynyt. Ongelman suuri pulma on se, että se esiintyy vain joskus. Selaimilla, jolla ongelma esiintynyt on mm. uudet firefox, chrome ja safari -selaimet. Ongelma on esiintynyt monissa toisistaan riippumattomilla applikaatioilla ja esiintyy sekä localhostissa, että eri palvelimilla.
Vastaava viesti Yii forumilla (jonka vastaus kerääntymä on huikeat nolla):
http://www.yiiframework.com/forum/index.php/
Onko kirjautuminen tapahtunut esim. sivu.fi -osoitteessa ja redirecti tapahtunut osoitteeseen www.sivu.fi (huom! toisessa on www alussa, toisessa ei)?
Tällöin sessio ei yleensä säily.
Leben veikkaus on hyvä, joskaan en tuossa koodissa nähnyt redirektiä kiinteään osoitteeseen.
Muutenhan ongelma olisi helppo selvittää mutta kun "se esiintyy vain joskus".
En ole pitkään aikaa törmännyt ongelmaan että tuollainen perustoiminnallisuus selaimen tai palvelimen päässä olisi rikki niin että toiminta olisi epädeterminististä, ja vaikea kuvitella miten Yiikään sen rikkoisi.
Luulisin että jos saat selvitettyä tuon mikä aiheuttaa ongelman esiintymisen, niin löydät myös ratkaisun.
Joo, no täytyy koittaa keksiä miten jäljitän bugin ja keksin reseptin, jolla saan uudelleen toistettua sen. Hajottavinta on, että omalla koneella usein ongelmaa ei edes esiinny, enkä voi noin vaan mennä debuggaan ongelmaa muitten koneille, joilla ongelma esiintyy lähes poikkeuksetta aina kun selaimen välimuistia ei ole tyhjennetty. Eli siitä päättelisin sen, että ongelma liittyy jo olemassa oleviin kekseihin tai sessio muuttujiin ja niiden aiheuttamiin sekaantumiin. Täytyy varmaan vaan syventyä syvälle siitä, että mitä framework tarkalleen ottaen tekee ja selvittää, että katoaako sessio oikeasti kokonaan tietokoneelta vai eikö aplikaatio vaan löydä sitä.
Kai se sitten jossain vaiheessa muuttuu takaisin deterministiseksi, kun vain keksin mikä tekijä siihen vaikuttaa.
Sessionhallinta tuskin liittyy Yiihin mitenkään, ellei se sitten ohita php:n sisäänrakennettua sessiointia. Php alustaa automaattisesti $_SESSION-taulukon sessioon tallennetuilla tiedoilla, kun se havaitsee sessiotunnisteen sisältävän evästeen selaimen lähettämissä otsikkotiedoissa.
tälläistä löytyi aiheesta:
https://bugs.php.net/bug.php?id=14636:
Session variables are lost when redirecting to a url using header() function.
This is actually not a bug at all but rather behavior of HTTP.
For PHP to be able to "find" a previously set session variable, it must be able to identify the client, right? Well, the default method used to accomplish this is via a cookie set when you initiate the session. Since it appears you are redirecting the user to the member's only page using the Location header on the same page the session is initiated, the PHPSESSID cookie will not be set. Thus, once the user arrives at the member's only page, PHP won't be able to identify the user. Their session variable is still there, but PHP won't give it to a stranger. :)
Basically, in your HTTP reponse that includes the Set-Cookie header, it needs to be a regular 200 OK response and not a protocol level redirection. If you absolutely have to have the behavior you're going for here, you're going to have to use a meta refresh for the redirection. Yes, it's not as cool, but it's the only way to set a cookie and redirect the client in the same response. Otherwise, you'll have to pass the value of the cookie on the URL, which might be a good option for you actually.
Hope that helps.
Mod. lisäsi linkin ja lainaustagit!
The Alchemist kirjoitti:
Php alustaa automaattisesti $_SESSION-taulukon sessioon tallennetuilla tiedoilla, kun se havaitsee sessiotunnisteen sisältävän evästeen selaimen lähettämissä otsikkotiedoissa.
Ei pidä paikkaansa. Istunto täytyy avata funktiolla session_start. Eihän automaattinen tunnistus olisi edes järkevästi mahdollinen, koska sekä evästeen nimen että istunnon tunnuksen voi itse valita (session_name, session_id).
Paulus M kirjoitti:
ongelma esiintyy lähes poikkeuksetta aina kun selaimen välimuistia ei ole tyhjennetty.
Jos ongelma todella korjaantuu välimuistin tyhjennyksellä, looginen debuggaus- ja korjausidea olisi, että tutkisit, millaiset välimuistiotsikot palvelin palauttaa, ja korjaisit sinne, että sivuja ei tallenneta välimuistiin. Jos taas ongelma korjaantuukin evästeiden tyhjennyksellä (aivan eri asia kuin välimuisti!), pitäisi tutkia, mitä evästeitä selaimissa on milläkin hetkellä.
groovyb kirjoitti:
groovyb:n laittama teksti nyt on ihan pielessä: Set-Cookie ei edellytä, että vastaus on 200 OK, vaan kirjautumisissa ihan säännönmukaisesti asetetaan eväste sivunlatauksella, jonka vastauskoodi on 303 See Other. Ylipäänsä 12 vuotta vanha, IE 5.5:llä havaittu ongelma ei ehkä ole asiassa erityisen relevantti.
Kiitos joka tapauksessa vaustauksista! Kohta täytyy saada taas projekti tuotantokuntoon ja täytyy koittaa debuggaa toi probleema noilla teidän antamilla vinkeillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.