2016-09-23 4 views
3

Ich habe ein Projekt, das auf einem lokalen Server funktioniert, aber nicht auf meinem Produktionsserver, weil Cookies vom Server nicht gesehen werden. Ich habe eine Minimalversion des Codes gemacht, die das Problem auf dem Server wiedergibt:

<?php 

if(!isset($_COOKIE['foo'])){ 
    setcookie('foo', 'bar', time() + 7*24*60*60, '/'); 
    echo "Cookie was not found, so we just created it."; 
} else { 
    echo "Cookie was found!"; 
} 

?> 

Egal, wie oft ich diese Seite aktualisieren, habe ich immer die „nicht gefunden“ -Meldung. Immer wenn ich versuche, die Variable $_COOKIE zu loggen, bekomme ich ein leeres Array. Allerdings:

  • Das Cookie im Browser vorhanden ist und richtig mit der Bitte
  • Das Cookie gesendet wird und in der gleichen Datei (es ist nicht ein Problem mit den path)
  • Dort lesen ist keine Ausgabe vor setcookie, und die Datei wird ohne BOM

denken in UTF8 codiert ich dies eine Server-Konfigurationsproblem ist, da der Code lokal funktioniert, aber ich habe keine Ahnung, wo sie suchen müssen. Hat jemand das schon mal gesehen, weißt du, was das verursachen könnte?

Wenn Sie mehr Informationen benötigen, sagen Sie es mir einfach und ich werde es zu meiner Frage hinzufügen. Vielen Dank!

+0

Jeder CDN und/oder Caching-Server beteiligt, der den Cookie schluckt ...? – deceze

+4

Überprüfen Sie die php.ini Ihres Servers auf die Direktive 'variables_order'. Ist das 'C' nicht dabei? http://php.net/manual/en/ini.core.php#ini.variables-order –

+0

@deceze Es ist ein Varnish-Cache eingerichtet, aber diese Seite wird nicht zwischengespeichert. Denkst du, das könnte Kekse schlucken? @Michael, danke für deinen Vorschlag, ich habe es überprüft und es scheint in Ordnung zu sein: 'variables_order = EGPCS' – blex

Antwort

1

Wenn ein Cache-Server oder ein CDN beteiligt ist, filtert es möglicherweise Cookies basierend auf einer Whitelist. Dies verbessert das Caching, da jede Anfrage mit einem eindeutigen Satz von Cookies als von anderen Anfragen verschieden betrachtet werden muss und nicht zwischengespeichert werden kann (Sie erhalten möglicherweise eine andere Antwort vom Server basierend auf Ihren Cookies, so der Cache-Server nicht Sie die zwischengespeicherte Antwort eines vorherigen Clients erhalten). Da viele Dienste Cookies setzen, die an den Server gesendet werden können (z. B. Analysepakete), aber keinerlei Einfluss auf den Inhalt der Antwort haben, würde das regelmäßige Speichern aller Cookies das Caching häufig vollständig unterlaufen.

Konfigurieren Sie den zuständigen Caching-Server, um speziell auf Ihren Cookie zu achten und ihn an den Ursprungsserver weiterzuleiten. Wenn Sie viele verschiedene Cookies haben, sollten Sie ihnen ein gemeinsames Präfix geben und eine Whitelist hinzufügen (z. B. foo-*).

+0

Gute Erklärung. Danke auch für den Hinweis auf das Präfix, der mir hilfreich sein kann, dass ich nicht jedes Mal, wenn ich einen neuen Keks brauche, meine Kollegen fragen muss. – blex

-1

Ich denke, dein Problem ist die Serverzeit. Überprüfen Sie Ihre Zeit mit der Funktion time() und vergleichen Sie sie mit der Ortszeit. Vielleicht ist einer von ihnen falsch.

+0

Vielen Dank für Ihre Antwort, aber ich habe die Zeit überprüft, und es ist das gleiche wie mein Gerät – blex

0

Ich hatte ähnliches Problem, und es stellte sich als HAProxy-Konfigurationsproblem heraus. Haben Sie Lastenausgleich zwischen dem Server und dem Benutzer?

+0

Vielen Dank für Ihre Eingabe, das könnte Ich werde meine Kollegen darum bitten. – blex

Verwandte Themen