Skip to content
This repository has been archived by the owner on Nov 3, 2023. It is now read-only.

Probleme mit Browser Cache #3184

Closed
ghost opened this issue Nov 29, 2011 · 34 comments
Closed

Probleme mit Browser Cache #3184

ghost opened this issue Nov 29, 2011 · 34 comments

Comments

@ghost
Copy link

ghost commented Nov 29, 2011

Contao Online Demo:

Backend:

  • Contao Server und Browser Cache aktivieren
  • Cachezeit im Startpunkt der Webseite auf 5 Minuten
  • alle Dateien bereinigen und abmelden (FE und BE)
  1. Einige Hauptmenues anklicken, damit der Browser Cache gefüllt wird:
    z.B. "Home", "The academy", "Courses"
  2. "Courses" anklicken
  3. Login als j.smith
  4. Nach Login werden einige neue Menuepunkte angezeigt, z.B. "Services/My account"
  5. "The academy" anklicken
    => die neuen Menuepunkte verschwinden
  6. Browser "neu laden"
    => die neuen Menuepunkte werden angezeigt

Die Effekte sind klar:

  1. Obwohl "Courses" sich auch im Browser Cache befindet, sorgt der Login mit seinem Post Request automatisch zum Löschen der Seite "Courses" aus dem Browser Cache.
    Für diese URL ist damit alles in Ordnung.
  2. "The academy" wird dann allerdings in Punkt 5 aus dem Browser Cache geholt und zeigt daher nur die Inhalte für everyone und nicht die Version für j.smith an.
  3. Durch "neu laden" erhält dann auch j.smith endlich seine korrekte Version vom Server.

Lösung:
Sobald der Nutzer im FE erfolgreich angemeldet ist, sollte an jeden seiner html Aufrufe automatisch ein Parameter angehängt werden: z.B. "&login".
Damit holt der Browser die Seiten für einen eingelogten User nicht aus dem Browser Cache.

"academy.html" ist für den Browser ja nicht gleich "academy.html?login".

--- Originally created by Georg on June 21st, 2011, at 01:42pm (ID 3184)

@leofeyer
Copy link
Member

Du hast Recht, allerdings ist die Lösung mit dem angehängten ?login nicht sehr elegant. Da gibt es bestimmt bessere Möglichkeiten über den Request-Header. Ideas, anyone?

--- Originally created on July 29th, 2011, at 05:41pm

@aschempp
Copy link
Member

Das Problem ist doch dass der Browser cacht, und somit den Server gar nicht angefragt wird. Damit wird auch ein Header schwierig, mir fällt da nur der ETag ein.

--- Originally created on July 30th, 2011, at 09:07am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Vielleicht könnte euch http://www.mnot.net/cache_docs/ noch helfen.

--- Originally created by innovativecreation on July 30th, 2011, at 10:15am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@andreas: Ja, der ETag wäre imho die saubere Lösung.
Momentan sagt Contao dem Browser ja, wie lange er es cachen soll. Solange die Zeit nicht abgelaufen ist, fragt der Browser somit auch nicht nach, was zu diesem Ticket hier führt. Die einzige mir bekannte Lösung, um den Besucher daheraus zu bekommen wäre in der Tat alle Urls zu modifizieren (z.B. durch einen Zufallswert um sicherzugehen, dass nicht bei &login irgendwann das gleiche Problem entsteht), da der Browser sonst nicht nachfragt.
Wenn man statt dem max-age-Header etc. dem Browser einen ETag liefern würde, würde der Browser bei jedem Seitenaufruf eine Anfrage an den Server machen um nachzufragen, ob sich etwas verändert hat. Nur im Falle einer Veränderung müsste Contao wirklich was ausliefern, sonst kann Contao dem Browser auch sagen, dass er das gecachte verwenden soll. Da Contao dann ja weiß das der Benutzer eingeloggt ist, kann er den ETag ja einfach ablehnen und den Inhalt ausliefern, womit das Problem behoben wäre und die URLs sauber bleiben.
Die Umstellung auf ETag hätte aber auch einen kleinen Nachteil: Der Server würde mehr anfragen verarbeiten müssen... Dafür hat der Etag aber auch Vorteile: Wenn man als max-age jetzt 24h einstellt, fragt der Browser wirklich nicht nach, wes wegen eine Nutzer vlt. eine News auf der Startseite der Website schon sehen, während es andere noch nicht tuen. Bei der Umstellung auf ETag würden alle sofort die Änderung sehen. Von daher bringt max-age großen Seiten vermutlich auf dynamischen Seiten eh nicht viel, da diese keine großen Zeiten angeben können wegen Aktualisierungen auf der Website (zdf nutzt z.B. max. 1 Minute). Bei kleinen Seiten ist der Cache vermutlich dagegen egal, da der Server eh mehr Däumchen dreht. Hinzukommt: Selbst wenn die Cachezeit abgelaufen ist, kann Contao dem Browser durch den ETag noch sagen, dass sich an der Seite nichts verändert hat, wodurch gegenüber dem bisherigen Verfahren der Server Traffic sparen könnte.

Von daher gibt es imho 2 Varianten, wobei ich die erstere bevorzuge

  • Komplett auf Etag umstellen, da imho die Vorteile die Nachteile überwiegen
  • Etag auf Seiten anwenden, wo benutzerabhängiger Content ist (ich glaube durch Erweiterungen kann Contao das gar nicht ermitteln) und beim Rest max-age

--- Originally created by SunBlack on July 30th, 2011, at 06:46pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

U.a. genau wegen dem Browser Cache habe ich mich mit Contao beschäftigt.
Und es hat ja einige Versionen gedauert bis die richtige Kombination von Headercodes gefunden und z.B. ETAG deaktiviert wurde, so dass der Browser Cache jetzt auch wirklich mit den gängigsten Browsern zuverlässig funktioniert.

Insofern bin ich gegen die halbe Kastration des Browsercache, der bei einigen Browsern dann evtl. sogar zu vollständigen Deaktivierung führt.
Außerdem entfiele dann auch die Server Entlastung, weil ja alle HTTP Request vom Server bearbeitet werden müssen.

Daher möchte ich mich noch mal für meine effektive Lösung aussprechen, die auch sehr einfach zu realisieren wäre:
das Anhängen eines zusätzlichen Parameters wie z.B. "?noBrowserCache" an alle Linkadressen in dem ausgelieferten HTML Text sobald sich jemand eingeloggt hat.
Dadurch werden im Browser automatisch evtl. schon gespeicherte Seiten ignoriert.
Und wenn Contao alle Seiten, die mit dem obigem Parameter angefordert werden mit den entsprechenden NoCache HTTP Headern ausliefert, bleibt das auch so.

Das wäre eine einfache Änderung in nur einem Modul.
Was spricht gegen diese Lösung?

--- Originally created by Georg on July 31st, 2011, at 02:30pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Es gibt eigentlich ein paar Dinge die dagegen sprechen:

  • Sobald man eingeloggt ist und jemand anderen dann einen Link schickt, bekommt dieser eine Seite, welche nicht gecacht wird, wodurch die Seite bei ihm unnötig langsam wird (wenn er auf eine Seite zurückkehrt)
  • Jeder Entwickler müsste beim bauen von Links daran denken, dass evtl. noch dieser Parameter hinzukommt. Und dies ist eine potentiell hohe Fehlerquelle, weil man das Fehlen nicht so schnell merken würde. Zwar könnte man mit einer php-Funktion das automatisch von php machen lassen, allerdings entsprächen die Seiten dann nicht mehr dem w3c-Standard (k.A. ob man das nachbearbeiten von Formularen ausschalten kann, da mir der Name der Funktion gerade nicht mehr einfällt)

Zum Etag: Wie gesagt, es werden zwar mehr HTTP-Anfragen gestellt, aber wenn das System sinnvoll mit Etags umgeht (also den ETag wirklich solange behält, wie sich die Seite nicht verändert hat und nicht zeitabhängig) sind ETags vermutlich trotzdem sparsamer, da Traffic gespart wird (wieviele Anfragen kann man an einen Server schicken um die gleiche Last zu erreichen, wie ein vollständiges generieren einer Seite?). Abgesehen davon: Die Änderung würde lediglich die html-Seite betreffen - sprich 1 von vielen Dateien, die vom Server angefragt wird. Schau dir einfach mal den Netzwerkverkehr an, wenn du eine Seite aufrufst, die du bereits im Cache hast: Für jedes Bild wird eine erneute Anfrage an den Server gesendet, ob sie gleich geblieben ist. Und merkst du etwas davon? Nein. Durch die .htaccess kann man zwar den Browser sagen, dass er dies bei Bildern nicht mehr machen soll, in dem man den Header ändert, aber auf den meisten Webseiten ist dies nicht der Fall. Von daher glaube ich nicht, dass eine Anfrage mehr (bei bestimmt mind. 10-20 die bei einer Webseite bei jedem Aufruf ausgeführt werden) spürbar ist.

Das einzige Argument gegen ETags ist imho, das Contao darauf nicht ganz vorbereitet ist, sprich er den Etag zeitabhängig verwerfen muss - wobei, eigentlich nicht...
Szenario:

  • Benutzer A ruft die Seite auf. Contao generiert die Webseite und generiert einen ETag, wobei die Cachezeit auf 7Minuten eingestellt ist.
  • Benutzer A ruft 5 Minuten später noch einmal die Seite auf. Etag wird an den Server geschickt, der jetzt nachschlagen muss, ob sie noch gültig ist oder nicht (müsste man überlegen ob er das über die DB abfragt oder lokal). Gültig, also gibt es eine "304 Not Modified"-Meldung, Contao muss also lediglich überprüfen ob der Cache noch gültig ist, ohne die Seite neu zu generieren
  • Benutzer A ruft die Seite noch einmal 5 Minuten später auf. Contao stellt fest, dass der Etag von der Zeit her abgelaufen ist (Cachezeit vorüber und Contao weiß nicht, ob es wirklich keine Änderung gab, da Erweiterungen ggf. doch Änderungen haben). Also generiert er die Seite neu und stellt fest: Moment einmal: der Etag ist ja wieder der gleiche - also kann er sich das ausliefern der Seite ersparen und auch wieder "304 Not Modified" melden, wodurch die Verbindung schneller ist, und auch lokal beim Benutzer, da die Seite nicht neu ausgeliefert wird, also weniger über das Netzwerk geht.

Vergleich jetzt ETag vs. max-age:
ETag: 3 Verbindungen mit 1 Auslieferung der Webseite
max-Age: 2 Verbindungen mit 2 Auslieferungen der Webseite
Etag + mag-age: 2 Verbindungen mit 1 Auslieferungen der Webseite

Zu bedenken ist dabei: Wenn du eine Cachezeit von 2h einstellt, weil du selten Änderungen einpflegst, würden alle Benutzer die Änderung sofort bemerken, sobald Contao den Etag für ungültig erklärt (was er bei einer Änderung an einem Artikel erzwingen kann). Bei max-age bekommen die Benutzer es zeitverzögert.

Wie gesagt: Ich empfinde den Vorteil von ETag höher, als den von max-age. Letztere finde ich für konstante Ressourcen deutlich geeigneter (Hintergrundgrafiken und so ändern sich doch arg selten, und da kann man einfach die Pfade variieren, wenn eine Änderung an alle Benutzer gleichzeitig raus soll)

--- Originally created by SunBlack on July 31st, 2011, at 02:58pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Ich sehe eine Einführung des ETEG Flags nur als Optimierung des Server Cache Modus.
Contao kann dann in Abhängikeit des HTTP Requests des Browsers (ETEG), Gültigkeit der Seite im Servercache und des Session Status (Login Status) entscheiden ob einfach ein 304, eine komplette Seite aus dem Server Cache oder eine neu generierte Seite gesendet wird.

Damit kann dann der Browser Cache Modus in Contao also gleich ganz entfallen!

Ich habe aber viele Bauchschmerzen mit dem ETEG Tag:
Warum verwenden weder ZDF, noch Spiegel oder Amazon (nur Beispiele) das ETEG Flag bei html Seiten?

Und ich sehe auch die Vorteile eines echten Browser Cache Modus, so wie er bisher in Contao existiert.
Also selbstverständlich mit den, in der Contao htaccess Datei schon vorgesehenen Browser Caching Angaben für statische Objekte.

Und bezüglich der Serverbelastung ist bis zur Entscheidungsfindung in Contao, dass evtl. nur ein 304 als Antwort gesendet werden muss, schon soviel passiert, dass die Ausgabe der Seite dann auch keine spürbare Mehrbelastung für den Server darstellt. Also bringt die ETEG Optimierung nur etwas für den Client - nicht jedoch für den Server.

Aber wie schon gesagt: der ETEG Modus wäre nur eine Optimierung des Contao Server Cache Modus - aber kein Ersatz für den Contao Browser Cache Modus.

--- Originally created by Georg on July 31st, 2011, at 10:25pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Was hatte ich da nur im Kopf: natürlich meine ich den ETag Header....

--- Originally created by Georg on August 1st, 2011, at 08:46am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@SunBlack: Wieso siehst Du bei dem zusätzlichen URL Parameter für eingeloggte User ein Problem mit w3c?

--- Originally created by Georg on August 1st, 2011, at 09:17am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@SunBlack: Meintest Du folgendes mit w3c konform:
academy.html?BrowserCache=no

--- Originally created by Georg on August 1st, 2011, at 09:40am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Wenn man es von php automatisch ergänzen lässt...

--- Originally created by SunBlack on August 4th, 2011, at 04:53pm

@leofeyer
Copy link
Member

ETags sind keine Alternative, solange sie nicht zuverlässig von allen Browsern unterstützt werden.

Auch das Anhängen von Parametern wird nur bedingt funktionieren, denn damit diese URLs angeklickt werden können, müssen sie zunächst im Quelltext ausgegeben werden. Und genau das funktioniert nicht, wenn die Seite bereits im Cache ist. Vermutlich bräuchte man dafür ein JavaScript, das auf jeden Fall immer ausgeführt werden kann. Nur wie erkennt dieses, ob sich jemand angemeldet hat?

--- Originally created on August 4th, 2011, at 05:00pm

@aschempp
Copy link
Member

Wir unterstützen ja nicht mal mehr den IE6, welche Browser können denn kein ETag? Und was ist daran schlimm wenn die dann halt nicht Cachen?

--- Originally created on August 4th, 2011, at 05:07pm

@leofeyer
Copy link
Member

Man kann ein System nicht "mal eben" auf ETags umrüsten. Es hat schon seinen Grund, warum (noch) niemand damit arbeitet :)

--- Originally created on August 4th, 2011, at 05:09pm

@leofeyer
Copy link
Member

Wie steht es denn mit einem Vary-Header? Lässt sich da etwas in Verbindung mit dem Auth-Cookie machen?

--- Originally created on August 4th, 2011, at 05:10pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Bezüglich Vary habe ich für den IE folgende Hinweise gefunden:

  • funktioniert nur mit ETag sinnvoll
  • IE9 ignoriert Vary mindestens teilweise

Eine Klarstellung zu dem zusätzlichem URL Parameter:
Im aktuellen Contao System gibt es den Browser Cache Modus nur für die öffentliche Version von Seiten.
Die URL von öffentlichen Seiten soll wie bisher ohne zusätzlichen Parameter ausgeliefert werden.

Sobald sich jedoch ein Nutzer erfolgreich angemeldet hat, soll Contao zwei Dinge ändern:

  • wie jetzt schon werden die HTTP Header so abgeändert, dass die Seiten für angemeldete User nicht im Browser Cache gespeichert werden
  • neu: in dem ausgelieferten html Code soll automatisch an alle darin befindlichen Links ein zusätzlicher Parameter angehängt werden
    (wie z.B. "&BrowserCache=no;" und natürlich gilt das nicht für Links auf fremde Domainen, sondern nur für Links, deren Domainen vom Contao Server verwaltet werden.)

Der Contao Server soll den zusätzliche URL Parameter bei einem Browser Request völlig ignorieren.
So wie jetzt schon:
http://demo.contao.org/academy.html?BrowserCache=no
sorgt für das gewünschte Ergebnis: der Browser ignoriert eine ggf. im Cache befindliche academy.html Version und Contao liefert eine Version der Seite, die meinem Session Status entspricht: entweder die für angemeldete Nutzer oder die öffentliche Version.

Das Anhängen dieses URL Parameter durch den Contao Server könnte z.B. so ähnlich ablaufen, wie das neue Contao erst ganz zum Schluss in dem HTML Dokument Informationen zum Browser Agent an die CSS Klasse anhängt.

Beim Login eines Nutzers sorgt der Post Data Request automatisch für das Löschen der Seite im Browser Cache.
(Leider zunächst nur für die URL, auf der der Login und damit der Post Data Request erfolgt.)
Wenn der Contao Server jedoch danach alle URL Links mit dem zusätzliche Parameter ausliefert, ignoriert der Browser die ggf. im Browser Cache befindliche Seite unter der gleichen URL, weil diese ohne den zusätzlichen Parameter abgelegt wurden.

Eine evtl. im Browser Cache gespeicherte Version für nicht angemeldete Nutzer muss also nicht gelöscht werden.

Der angemeldete Nutzer dagegen ruft nach dem Login nur noch URL Adressen mit dem zusätzlichen Parameter auf. Und diese Version der Seiten werden (aufgrund der HTTP Header Angaben von Contao) nicht im Browser Cache gespeichert.

@SunBlack:

  • sollte ich als angemeldeter User einen Link versenden, so ist der zusätzliche URL Parameter in dem Link doch völlig unschädlich:
    Der Empfänger ruft die Seite auf. Wegen dem Parameter ignoriert der Browser zwar zunächst eine ggf. im Cache befindliche Version dieser Seite und ruft die Seite vom Server ab.
    (Ist nicht sehr wahrscheinlich, dass der Link Empfänger genau diese Seite überhaupt schon bzw. noch in seinem Cache findet, bei Browser Cache Zeiten von z.B. 24 h)
    Danach bekommt der Link Empfänger beim weiteren Surfen auf der gelinkten Seite vom Contao Server genau die Antwort, die seinem Session Status entsprechen: im Normal Fall als nicht angemeldeter User also wieder alle Link URL ohne den zusätzlichen Parameter und damit nimmt der Browser des Link Empfängers auch wieder die ggf. noch im Cache befindlichen Seiten.
  • wenn, wie oben erwähnt, die URL Anpassung für angemeldete Nutzer ähnlich abläuft wie die CSS Klassen Ergänzung um die Information zum Browser Agent, müsste die URL Ergänzung doch für die meisten Module völlig transparent geschehen
  • Deinen Hinweis bezüglich w3c habe ich nicht verstanden

--- Originally created by Georg on August 4th, 2011, at 11:41pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

`Georg: Schau dir einfach mal "session.use_trans_sid" an. Wenn man das aktiviert, fügt php an alle relativen Pfade in der Ausgabe automatisch die SID an (müsste man schauen, ob man es umbiegen kann, dass es nicht die SID ist, sondern dein "BrowserCache=no"-Flag). Vorteil wäre: Es würden automatisch alle nötigen URLS angepasst werden, ohne dass man als Erweiterungsentwickler darauf achten muss. Nachteile: Der modifizierte Code ist zu mindestens nicht mehr XHTML-konform (bei Formularen), ich weiß nicht ob jeder Server es unterstützt und da es für SIDs ausgelegt ist, dürfte es auch hässlicher Code werden. Von daher würde ich diese Variante eher ablehnen.
Bei der Variante mit dem manuell hinzugefügten Flag, wäre dafür das Problem, dass jeder User beim bauen von Links daran denken müsste.

`Leo: Weißt du welche Browser ETag nicht unterstützen und marktrelevant sind (also keine Textbrowser oder so ;) )? Im Falle der nicht-unterstützung würde bei denen ja lediglich der Cache nicht funktionieren. Da imho aber alle moderneren Browser dies unterstützen, dürfte es nur sehr wenige Benutzer betreffen, wobei ich da auch nur ganz kurz im Netz geschaut habe (für mich klang es beim IE nur so, als ob er es unterstützt aber nur, wenn bestimmte andere Header nicht gesetzt sind -> müsste man austesten). Wenn wir auf jeden kleinen bzw. alten Browser achten, dürfte Contao 2.10 sonst ja auch kein CSS3-Support mitbringen... (<=IE9-Surfer ohne JS werden an den Farbverläufen Spaß haben ;) ). Also warum hier mehr Rücksicht nehmen?
@leo: ETags werden durchaus schon eingesetzt - auch wenn eher für andere Zwecke (alternative zu Cookies, um Cookie-blockende Browser trotzdem tracken zu können... - siehe engl. Wikipedia)

--- Originally created by SunBlack on August 5th, 2011, at 12:49am

@leofeyer
Copy link
Member

Sobald sich jedoch ein Nutzer erfolgreich angemeldet hat, soll Contao zwei Dinge ändern:

Das ist ja genau das Problem. Wenn die aufgerufene Seite bereits im Cache ist, stellt der Browser gar keine Anfrage mehr an Contao sondern nimmt einfach die Seite aus dem Cache. Deswegen funktioniert dieser Ansatz auch nicht.

--- Originally created on August 5th, 2011, at 08:16am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@leo:
Wenn die Option Weiterleitung nach Login "zur zuletzt besuchten Seite" gesetzt ist gibt es kein Problem, weil alle Browser bei einem Post Request die Seite aus dem Cache entfernen.

Dein Hinweis bezieht sich auf die Option zur Weiterleitung auf eine beliebige Seite.
Genau wie in der Contao Demo werde ich diese Option doch nur nutzen, wenn ich den Nutzer nach Login auf eine Seite lenken möchte, die sowieso nur für angemeldete Nutzer sichtbar ist.

Seiten die nur für angemeldete Nutzer sichtbar sind, werden gemäß der aktuellen Contao Systematik jedoch nie im Browser Cache gespeichert.

Oder anders ausgedrückt: wenn ich den registrierten Nutzer nach dem Login unbedingt auf eine Seite lenken möchte,
die nicht der URL entspricht auf der der Login erfolgte
und dessen URL auch für nicht registrierte Nutzer existiert
und dessen Seiteninhalt sich zwischen dem für registrierte und nicht registrierte Nutzer unterscheidet,
dann muss ich in diesem Spezialfall die Browser Cache Zeit für diese spezielle Weiterleitungs URL auf Null setzen.

Damit kann ich gut leben.

Ich sehe auch einfach keine andere Option.
Alles was bisher angerissen wurde hat nichts mehr mit einem echten Browser Cache Modus zu tun, sondern optimiert nur den Server Cache Modus (Serverantwort 304 statt Body).

--- Originally created by Georg on August 5th, 2011, at 11:44am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@SunBlack:
Stimmt - die SID zusätzlich in der URL würde das Problem lösen.
Aber wir sind uns wohl einig, dass eine SID in den URLs für öffentliche Seiten auf keinen Fall auftauchen darf (SEO usw.)

Leider besteht Leo darauf, dass in Contao auch bei öffentlichen Seiten für jeden Nutzer schon eine Session angelegt wird.

Eine Umstellung der öffentlichen (und bitte nur der öffentlichen) Seiten auf eine REST Funktionalität (also ohne Session) kann nicht so schwer sein.
In Contao 2.9 kann ich die Cookies im Browser ja auch schon deaktivieren und trotzdem funktioniert z.B. das Kontaktformular so wie es soll.

Eröffnet auch die Option Contao auf einem Server Cluster zu betreiben.

--- Originally created by Georg on August 5th, 2011, at 12:06pm

@tristanlins
Copy link
Contributor

@georg
Ob die Option "zur zuletzt besuchten Seite" gesetzt ist oder du auf eine andere Seite weiterleitest, das Problem besteht trotz allem. Das lässt sich auch ganz einfach erklären: Du besuchst die Startseite, wechselst dann auf eine Unterseite und meldest dich an. Wenn du durch "zur zuletzt besuchten Seite" zur Unterseite weitergeleitet wirst, wird diese aktualisiert. Wenn du auf eine andere Seite weitergeleitet wirst, dann wird die Unterseite nicht aktualisiert. Aber diese Betrachtung bedingt, dass es nur um die Unterseite geht. Was ist denn mit der Startseite? Es ist egal ob "zur zuletzt besuchten Seite" gesetzt ist oder nicht, die Startseite wird +nicht+ aktualisiert und weiterhin +aus dem Cache geladen+ obwohl man sich angemeldet hat. Damit sind wir wieder beim gleichen Problem und weder "zur zuletzt besuchten Seite", noch die "Weiterleitungsseite" helfen uns da raus.

Außerdem kann ich Leo durchaus verstehen, dass er auch für "Gäste" eine Session erstellt. Wie willst du denn bitte eine öffentliche, von einer nicht öffentlichen Seite unterscheiden? Du kannst den Status "Nur für Mitglieder sichtbar" ja eben nicht nur für Seiten, sondern auch für Inhaltselemente einstellen. Also kannst du es nicht an der "Öffentlichkeit" einer Seite festmachen ob du eine Session startest oder nicht. Ich weiß nicht ob es Core-Funktionen gibt, die auch ohne einen Mitglieder-Login die Session benutzen. Ich weiß aber, dass ich schon Erweiterungen geschrieben hab, die das taten. Und die ganzen Daten in Cookies ablegen ... ich bitte dich, das wäre absoluter Wahnsinn. Ergo denke ich, dass wir die Session brauchen, egal ob der Besucher als Mitglied angemeldet ist oder nicht. Eine Session ist immerhin nicht nur dafür da, den Login-Status zu speichern, sondern auch die Benutzerdaten, bei Bedarf unabhängig von irgendeinem Login.

Du meinst wohl auch eher REST Prinzip anstatt Funktionalität, denn mit REST Funktionalität hat deine Erläuterung gar nichts zu tun. Aber auch bei REST gibt es Authentifizierung, nur halt keine Persistente. Die kann entweder mittels Username+Passwort die dann IMMER WIEDER mitgeschickt werden geschehen oder aber mit einem AuthKey, der aber wieder gleichzusetzen mit der SID wäre. Und wie ich im Absatz oben schon erläutert habe, du kannst es eben nicht entscheiden ob eine Webseite wirklich öffentlich oder eben nicht öffentlich ist und Sessions werden eben auch für mehr gebraucht als nur den Login.

Und zu guter Letzt, ich weiß ja nicht wie du Clustering betreibst, aber ob du Sessions hast oder nicht ist für das Clustering total egal. Du brauchst nur einen Session Exchange, das geht am einfachsten natürlich über eine Datenbank, dann kannst du auch mit Sessions über einen ganzen Cluster arbeiten. Das ist jetzt nur auf Webserver-Cluster bezogen. Beim Datenbank-Cluster spielt es sogar überhaupt keine Rolle ob Session da oder nicht, weil die Session etwas ist, dass im Webserver oder korrekt in PHP abgewickelt wird. Meiner Erfahrung nach ist Clustering in den meisten Fällen eher eine Frage des Application Environment, anstatt der Software.

--- Originally created on August 6th, 2011, at 01:49am

@tristanlins
Copy link
Contributor

Ich habe grade nochmal nachgegrübelt, ich habe grad den Contao Core nicht vor mir (und will ihn um diese Zeit auch nicht mehr runter laden), deshalb muss ich etwas ins Blaue raten.
Aktuell verwendet Contao lediglich das SID Cookie von PHP? Auch wenn man sich anmeldet, ändert sich nichts, weil das ja nur in der Session gespeichert wird.
Müsste es nicht reichen, einen neuen Cookie zu setzen, also z.B. die Zeit des Login? LOGINTIME=time() oder so ähnlich? Weil wenn sich ein Cookie im Browser ändert, ändert sich ja potentiell auch der Request, da Cookies ja mit jedem Request verschickt werden. Ergo müsste der Browser auch erkennen, dass der Response potentiell anders ist, denn er hat ja jetzt einen anderen Request den er sendet.
Ich vermute einfach mal, dass die Browser nicht einfach nur die URL, sondern auch andere Teile des Request wie z.B. die übermittelten Cookies als Cache-Kriterium verwenden.
Es würde in meinen Augen zumindest Sinn machen, daher wäre es vielleicht interessant das mal zu überprüfen. :-)

Gute Nacht...

--- Originally created on August 6th, 2011, at 01:59am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@Tril:
Vielen Dank, dass Du Dich zu so "früher Stunde" ausführlich mit meinen Anmerkungen auseinander gesetzt hast.
Würde ich gerne auch noch mal im Detail darauf antworten; habe jetzt aber nur kurz Zeit.
Daher zunächst nur zu den Cookies:

Contao speichert beim Besuch einer beliebigen Seite sofort die SID im Cookie "PHPSESSID".
Nach einem Login im FE wird von Contao das Cookie "FE_USER_AUTH" zusätzlich zum PHP Cookie angelegt.
Beim Logout wird es wieder gelöscht.

Das entspricht nach meinem Verständnis Deinem Vorschlag.
Hilft bezüglich des Browser Cache Problems leider nicht, sonst gäbe es dieses Ticket ja nicht ;-))

--- Originally created by Georg on August 6th, 2011, at 05:48pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@Tril:
Auf das Absenden von Formularen (wie z.B. mit den Login Daten) reagiert Contao immer mit einer 303 Antwort.
Diese enthält im Header u.a. zwei Informationen:

  1. Cache-Control : no-store, no-cache, usw...
  2. Location: die Ziel URL

Das NoCache unter 1. gilt für die URL, von der das Formular abgesendet wurde.
Dadurch löscht Contao mit die 303 Antwort immer die Seite aus dem Browser Cache, von der ein Formular abgesendet wurde.
Erst danach wird der Browser auf die Ziel URL geleitet.
Das kann dann je nach Einstellung in Contao wieder die gleiche URL wie beim Absenden des Formulars oder eine beliebige andere sein.

Das Löschen der Seite aus dem Browser Cache in Schritt 1 funktioniert auch auf der Startseite.
Daher meine Aussage, dass mit der Option Weiterleitung "zur zuletzt besuchten Seite" kein Problem (mit dem zusätzlichen URL Parameter) auftritt.
Dein Problem mit der Startseite kann ich deshalb nicht nachvollziehen.

--- Originally created by Georg on August 6th, 2011, at 11:37pm

@tristanlins
Copy link
Contributor

@georg
ganz einfach, du implizierst, dass du die Loginmaske auf der Startseite ausführst und damit dann der Cache der Startseite gelöscht wird. Ich beschreibe es mal lieber an einer kleinen Sequence:

Eintritt auf Startseite
Wechsel auf Unterseite
Login auf Unterseite
303 mit no-cache löscht Cache der Unterseite
Redirect auf Unterseite ODER auf Weiterleitungsseite
Wechsel auf Startseite

Wenn du das nachverfolgst, stellst du fest, dass dann genau das ursprüngliche Problem auftritt und die Option "zur zuletzt besuchten Seite" ODER Weiterleitungsseite nicht den Cache der Startseite löscht. Das ist ja das ursprüngliche Problem, aber weder "zur zuletzt besuchten Seite" ODER Weiterleitungsseite helfen dagegen ja nicht. So hatte ich dich zumindest verstanden, dass eine der beiden Optionen dieses Problem lösen würde. Wenn nicht, dann ignoriere mich einfach, da hab ich was in den falschen Hals bekommen.
Ich grübel derweil mal über eine andere Lösung nach.

--- Originally created on August 8th, 2011, at 10:10pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

@Tril:
Um zum Schluss wieder auf die Startseite zu kommen würde der Nutzer z.B. auf der Contao Demo Seite im Navigationsmenue auf "Home" klicken.
Nach dem Anmelden sind jedoch die URL aller Links mit dem Parameter ergänzt.
Also lautet der Link hinter "Home" für die Startseite jetzt:
http://demo.contao.org/home.html&BrowserCache=no

Oder wie kommt der Nutzer in Deinem letzten Schritt wieder auf die Startseite?

Wenn er natürlich von Hand irgendeine URL im Browser eingibt, die sich noch im Browser Cache befindet, dann wird diese öffentliche Version auch angezeigt.
Aber das passiert nicht nur mit der URL der Startseite.
Ich habe daher offenbar Deinen Einwand noch nicht richtig verstanden.

--- Originally created by Georg on August 8th, 2011, at 11:29pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Nachdem die Sommerferien etwas Abstand zu diesem Thema gebracht haben: gibt es frische Ideen?

Wir hatten bis jetzt:
1.) Nutzung Etag und/oder Vary Header:
Deren Anhänger möchte ich bitten diesen Gedanken in einem neuen Ticket weiter zu verfolgen.
Die Vorschläge zur Optimierung der Serverantwort und zur Reduzierung des Datenverkehrs sollten sicherlich weiterverfolgt werden.
Mit einem echten Browser Cache hat das jedoch nichts zu tun.

2.) Anhängen eines Parameters an die URL
Mit der Anmeldung des Nutzers (Antwortseite auf erfolgreichen Login) erhält der Nutzer Seiten von Contao mit folgenden Eigenschaften:

  • werden nicht im Browser Cache gespeichert (Standard Contao Verhalten)
  • jeder interne Link innerhalb der Antwortseite (auch im redirect nach dem login) wird durch einen Parameter ergänzt
    Durch den zusätzlichen Parameter in der URL wird verhindert, dass der Browser eine ggf. schon im Browser Cache befindliche Seite anzeigt.

Nicht angemeldete Nutzer erhalten unverändert alle Seiten ohne den Parameter in den Links.

2a) mein Parameter Vorschlag ala "...?BrowserCache=No"
Das Anhängen des zusätzlichen Parameters an jeden Link muss durch Contao erfolgen.
Ähnlich wie die mit 2.10 eingeführte Ergänzung der CSS Klasse um die Information zum Browsertypen.

2b.) SunBlacks Vorschlag session.use_trans_sid
Damit würde der Webserver selbständig alle URL in den Links um den Parameter der PHP Session ID ergänzen.
Eigentlich ist die Session ID in der URL ein Sicherheitsproblem (Session Fixation usw.), aber bei Contao wird der Front End und Back End User nach seinem Login durch eigene, zusätzliche Contao Cookies abgesichert.

Jedoch darf der zusätzliche Parameter für einen öffentlichen Nutzer nicht in der URL auftauchen (SEO).
Contao müsste also innerhalb der gleichen PHP Session zunächst für den nicht angemeldeten Nutzer session.use_trans_sid, false setzen.
Und nach einer erfolgreichen Anmeldung session.use_trans_sid, true.
Geht das überhaupt 1. innnerhalb der gleichen PHP Session und 2. pro PHP Session oder nur global?

Hier mal eine neue Anregung:
3.) vollständige Trennung der URLs zwischen voll statisch (=cachebar) und realtime (darf nie in den Cache)
Damit meine ich nicht nur eine konzeptionelle vollständige Trennung der Seiten für den öffentlichen Bereich und einem Member Bereich, (die ich ja jetzt schon beliebig vornehmen kann) sondern auch eine Unterstützung durch Contao z.b. bei Formularen auf öffentlichen Seiten: login, search, subscribe, contact form usw.

z.B. eine
/home.html mit einer Login form action="/home-NoBrowserCache.html"

D.h. die /home.html bleibt statisch und kann im Browser Cache verbleiben.
Die Verifikation der Nutzereingaben geschieht dann auf der nicht cacheable /home-NoBrowserCache.html, die inhaltlich eine Kopie der /home.html Seite ist, ergänzt um die dynamischen Fehlermeldungen.

--- Originally created by Georg on September 2nd, 2011, at 03:20pm

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Simple und einfache Antwort:
Das Problem lässt sich nicht lösen.

Man kann hier nur 2 Fallunterscheidungen machen:

  • Wir haben eine Seite ohne Userspezifischen Content (keine Anmeldung möglich), dann kann man wie bisher halten.
  • Wir haben eine Seite mit Userspezifischen Content: Hier lässt das HTTP Protokoll einfach keine Möglichkeit zu! Es muss IMMER ein Revalidate beim Server gemacht werden, da weder Caching-Proxies noch Browser-Caches wissen, welcher User den Request durchführt (da wir ja alles "verhashen")... Das kann nur der Server.

Trotzdem wäre ein Umstieg auf ETag, mit sehr kleinen max-age Zeiten (< 1 min) das Beste was man machen kann.

Wenn bei jemanden der Server nicht mehr hergibt, dann muss man ein Cluster verwenden oder einen größeren Server.

Die sauberste Möglichkeit die mir noch einfällt wäre, eine komplett eigenen Kontextpfad einzufügen:
domain.tld/u/start.html
mod_rewrite schreibt das beim Server, auf Standard um, wenn FE_USER_AUTH sitzt, wenn nicht, dann gibts ein Redirect auf die URL ohne u/
TL_PATH wird mit u/ gepostfixt, wenn ein FE_USER_AUTH Cookie sitzt. (Das modifiziert die BaseURL)
Seiten mit eingeloggten User, sollten aber auch Cache-Control: no-store oder sogar no-cache bekommen.

--- Originally created by backbone on September 3rd, 2011, at 02:57am

@ghost
Copy link
Author

ghost commented Nov 29, 2011

Um das nochmal ein bisschen klarer rüberzubringen mit dem eigenen Contextpfad:

http://www.domain.tld/tlpath/mein/seiten/alias.html
-> Das wär der Link zu einer Seite, die ganz normal gecacht wird.

http://www.domain.tld/tlpath/u/mein/seiten/alias.html
-> Das ist der Link zu einer nicht cachebaren userspezifischen Seite.

Kommt ein nicht eingeloggter User auf:

Kommt ein eingeloggter User auf:

--- Originally created by backbone on September 6th, 2011, at 02:43pm

@aschempp
Copy link
Member

Hat sich dieses Problem nicht erledigt, seit wir in 2.11 die Option bieten den Brower-Cache nicht zu nutzen?

@leofeyer
Copy link
Member

leofeyer commented Nov 2, 2013

Kann es sein, dass ich gerade in fc511a3 eine ganz einfache Lösung für dieses Problem gefunden habe?

Die Seite wird einfach immer komplett gerendert, sobald ein Auth-Cookie vorhanden ist – egal ob dieses noch gültig ist oder nicht. Falls es nicht gültig war, wird es einfach gelöscht und ab dem nächsten Aufruf wird aus dem Cache geladen. Falls es aber gültig war oder die dauerhafte Anmeldung zum Tragen kommt, ist der Benutzer direkt angemeldet und das beschriebene Problem tritt nicht mehr auf.

Oder habe ich etwas übersehen?

@aschempp
Copy link
Member

aschempp commented Nov 2, 2013

Nun, das würde ja (auch) nur funktionieren wenn der Browsercache nicht aktiv ist?

@leofeyer
Copy link
Member

leofeyer commented Nov 3, 2013

Du hast Recht, mein Patch löst nur einen Teil des Problems (nämlich das Server-seitige). Aber immerhin :)

@leofeyer
Copy link
Member

Das Problem ist jetzt endlich gelöst (siehe contao/core-bundle#749).

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants