hotti: Sicherstellen, dass Cookies akzeptiert werden

es geht um einen kleinen Shop, der einen Cookie braucht für den Warenkorb. Nun ist es ja so, dass beim ersten Aufruf der Seite, egal welche Unterseite, der Cookie erst zum Browser geschickt wird, der Cookie ist frühestens beim Aufruf einer zweiten Seite am Server lesbar.

Gefragt ist ein benutzerfreundliches Design, ein zusätzlicher Menüpunkt, etwa 'Cookie testen' soll vermieden werden.

Mit dieser Prämisse bleibt eigentlich nur Eines: Auf jeder Seite einen Hinweis einbauen, dass 'noch kein Cookie gestzt ist', dieser Hinweis verschwindet spätestens beim Aufruf einer zweiten Seite sofern der Browser Cookies dieser Domain akzeptiert, macht er das nicht, bleibt der Hinweis und beim Hinzufügen eines Artikels zum Warenkorb käme in diesem Fall eine etwas umfangreichere und unmissverständliche Fehlerseite.

Habt Ihr evntl. andere Vorschläge (außer auf Cookie verzichten)?

Hotti

  1. versuchs mit ajax :)

    Nach dem Seiten-Laden wird im Hintergrund eine PHP-Datei geladen, welche einfach prüft, ob das Cookie da ist.
    Jenachdem, welches Ergebnis ensteht, kannst du dann eine Warnung oder Meldung ausgeben. :)

    Is für mich jedenfalls die beste Lösung :)

    1. hi,

      versuchs mit ajax :)
      Is für mich jedenfalls die beste Lösung :)

      Isses auch, weil damit ein zweiter Prozess da ist und alles ist geritzt ;)
      Aber ohne JS, kein Ajax... bedenke, dass findige User JS abschalten können. Ergo soll das erstmal ohne JS laufen, Ajax setze ich erst so ziemlich am Schluss drauf (wenns überhaupt notwendig ist).

      Hotti

      --
      Ohne Arme keine Kekse.
      1. Hallo,

        versuchs mit ajax :)
        Is für mich jedenfalls die beste Lösung :)
        Isses auch, weil damit ein zweiter Prozess da ist und alles ist geritzt ;)
        Aber ohne JS, kein Ajax... bedenke, dass findige User JS abschalten können.

        ja, dann mach die Überpürfung halt anhand einer eingebundenen Bild- oder CSS-Ressource, die durch ein Script ausgeliefert wird.

        Ciao,
         Martin

        --
        Wer morgens zerknittert aufsteht, hat den ganzen Tag Gelegenheit, sich zu entfalten.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          versuchs mit ajax :)
          Is für mich jedenfalls die beste Lösung :)
          Isses auch, weil damit ein zweiter Prozess da ist und alles ist geritzt ;)
          Aber ohne JS, kein Ajax... bedenke, dass findige User JS abschalten können.

          ja, dann mach die Überpürfung halt anhand einer eingebundenen Bild- oder CSS-Ressource, die durch ein Script ausgeliefert wird.

          Ciao,
          Martin

          Das wär ne idee. Und da könnte man sogar javascript als indirekte weiche nutzen. die grafik wird einfach geladen und angezeigt. wenn keine cookies gefunden werden, wird die grafik einfach mit der info gefüllt. z. b. "Bitte Cookies aktivieren". Wenn nicht, lieferts einfach nen 1x1-transparent-pixel-gif aus :)

          1. wenn keine cookies gefunden werden, wird die grafik einfach mit der info gefüllt. z. b. "Bitte Cookies aktivieren". Wenn nicht, lieferts einfach nen 1x1-transparent-pixel-gif aus :)

            Warum übergibst Du die SID in dem Fall nicht einfach als GET-Parameter?

  2. Moin!

    es geht um einen kleinen Shop, der einen Cookie braucht für den Warenkorb. Nun ist es ja so, dass beim ersten Aufruf der Seite, egal welche Unterseite, der Cookie erst zum Browser geschickt wird, der Cookie ist frühestens beim Aufruf einer zweiten Seite am Server lesbar.

    Man wird in der Regel den Cookie-losen Aufruf erkennen und deshalb in dieser Antwort sowohl Cookie als auch ein Redirect auf dieselbe Seite setzen (ggf. ergänzt um einen URL-Parameter, der als Counter die Anzahl erfolgter Redirects angibt, damit man eine entstehende Endlosschleife am Ende mit einem Hinweistext abbrechen kann).

    - Sven Rautenberg

    1. Moin!

      es geht um einen kleinen Shop, der einen Cookie braucht für den Warenkorb. Nun ist es ja so, dass beim ersten Aufruf der Seite, egal welche Unterseite, der Cookie erst zum Browser geschickt wird, der Cookie ist frühestens beim Aufruf einer zweiten Seite am Server lesbar.

      Man wird in der Regel den Cookie-losen Aufruf erkennen und deshalb in dieser Antwort sowohl Cookie als auch ein Redirect auf dieselbe Seite setzen (ggf. ergänzt um einen URL-Parameter, der als Counter die Anzahl erfolgter Redirects angibt, damit man eine entstehende Endlosschleife am Ende mit einem Hinweistext abbrechen kann).

      • Sven Rautenberg

      natürlich.

      <?  
      if(!isset($_COOKIE["cookietest"])) {  
          if($_GET["cookiecount"] < 2) {  
              setCookie("cookietest","1");  
              header("Location: ?cookiecount=" . (@(int)$_GET["cookiecount"] + 1));  
          }else{  
              header("Location: nocookies.php");  
          }  
      }  
      ?>
      

      so würde ichs machen.

      1. Hallo,

        header("Location: ?cookiecount=" . (@(int)$_GET["cookiecount"] + 1));
                header("Location: nocookies.php");
        so würde ichs machen.

        dann aber bitte korrekt: Der Location-Header muss eine *absolute* URL enthalten.

        Ciao,
         Martin

        --
        F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
        A: Mein Arzt hat mir Valium verschrieben.
        F: Und das hilft?
        A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Seit wann braucht header("Location ...") eine absolute pfadangabe? O_O relative oder ergänzende Angaben reichen auch.

          header("Location: http://localhost/index.php")
          header("Location: /index.php")
          header("Location: ../index.php")
          header("Location: ./index.php")
          header("Location: ?wert=daten")

          funktionieren alle bei mir. habe es soeben getestet. (Apache)

          1. Hallo,

            Seit wann braucht header("Location ...") eine absolute pfadangabe? O_O relative oder ergänzende Angaben reichen auch.

            es ist bekannt, dass es in den meisten Situationen und mit den meisten Clients "funzt". Die HTTP-Spezifikation verlangt es dennoch.

            funktionieren alle bei mir. habe es soeben getestet. (Apache)

            Dem Apachen ist es egal, der haut die Header ja nur raus, ohne sie zu interpretieren. Wichtig ist, was die Clients machen. Und dass es alle "zufällig" ordentlich machen, die du getestet hast, muss nicht heißen, dass es jetzt und in Zukunft wirklich alle so machen. Ein beliebiger HTTP-Client dürfte die fehlerhafte Angabe auch einfach ignorieren.

            Ciao,
             Martin

            --
            F: Was sagt die kleine Kerze zur großen Kerze?
            A: Ich gehe heute nacht aus!
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Insgesamt 5 verschiedene server (getestet!) interpretieren die besagten varianten korrekt. (hab genug kollegen, bei denen ich subdomains drauf hab).

              Zum Beispiel: http://eul.woetroep.de/ da is server nummer 1
              http://prattler.de/ server nummer 2 (hatte mal ne subodmain drauf)
              http://scibble.eu/ server nummer 3 (ich habe die engine für scibble entworfen. siehe andron1234.an.ohost.de. da gibts die rohfassung)

              freehoster
              http://andron1234.an.ohost.de/ server nummer 4
              http://fwb3b.cwsurf.de/ server nummer 5

              So. Und jetzt sag nochmal, "zufällig". :)

              1. Hi,

                Insgesamt 5 verschiedene server (getestet!) interpretieren die besagten varianten korrekt. (hab genug kollegen, bei denen ich subdomains drauf hab).

                Du hast es noch immer nicht verstanden, daß der Redirect-Header nicht vom Server, sondern vom Client interpretiert werden muß.

                So. Und jetzt sag nochmal, "zufällig". :)

                Zufällig, weil Du für Deine vollkommen sinnlosen Servertests zufällig nur Clients benutzt hast, die auch relative URLs erlauben.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                1. Öh. Ne?

                  andron1234.an.ohost.de hatte täglich mehrere dutzend NEUE user.
                  scibble hat davon täglich sogar schon mehrere hundert.
                  Und bisher gabs da keine fehler im Redirect.

                  Ich möcht ma einen clienten sehn, wo ein header("Location: seite.php") nicht ausgeführt wird. Habe ich bisher noch NIRGENDS gesehen. Weder Windows, Linux oder Macintosh. Firefox, IE, Opera, Chrome.

                  Ich glaub wirklich nicht dran, dass es notwendig ist, dass dort absolute pfade rein sollen o_O

                  1. Hallo,

                    Ich möcht ma einen clienten sehn, wo ein header("Location: seite.php") nicht ausgeführt wird. Habe ich bisher noch NIRGENDS gesehen. Weder Windows, Linux oder Macintosh. Firefox, IE, Opera, Chrome.
                    Ich glaub wirklich nicht dran, dass es notwendig ist, dass dort absolute pfade rein sollen o_O

                    ich möchte mal irgendeinen Fußgänger sehen, der mir nicht ausweicht, wenn ich ihm entgegenkomme. Ich glaub wirklich nicht dran, dass es notwendig ist, dass ich mich mit dem Auto aus der Fußgängerzone raushalte.

                    *scnr*
                     Martin

                    --
                    Es gibt Tage, da gelingt einem einfach alles.
                    Aber das ist kein Grund zur Sorge; das geht vorbei.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  2. Selbst, wenn header("Location: ...") absolute pfade im Strict-Fall verlangt, dann dürfte die Masse der Clienten, die es nur so akzeptieren, so verschwindend gering sein, dass die relative oder unvollständige Angabe quasi schon als standard geklärt ist. (selbst in diversen größeren projekten wird nicht mit absoluten pfaden redirected. Und da spielen VIELE. Zum Beispiel freewar.de. dort spielen mehrere TAUSEND täglich. Und das mit  mehreren tehntausend Seitenaufrufen pro Stunde. Mit vielen Redirects.)

                    1. Hallo,

                      Selbst, wenn header("Location: ...") absolute pfade im Strict-Fall verlangt, dann dürfte die Masse der Clienten, die es nur so akzeptieren, so verschwindend gering sein, dass die relative oder unvollständige Angabe quasi schon als standard geklärt ist.

                      nein, der Standard ist klar. Der Standard ist im Protokoll festgelegt. Selbstverständlich ist es eine gute Idee, etwas *richtig* zu machen, vor allem wenn der Aufwand nahezu vernachlässigbar ist.

                      Freundliche Grüße

                      Vinzenz

                      1. Moin!

                        Selbst, wenn header("Location: ...") absolute pfade im Strict-Fall verlangt, dann dürfte die Masse der Clienten, die es nur so akzeptieren, so verschwindend gering sein, dass die relative oder unvollständige Angabe quasi schon als standard geklärt ist.

                        nein, der Standard ist klar. Der Standard ist im Protokoll festgelegt. Selbstverständlich ist es eine gute Idee, etwas *richtig* zu machen, vor allem wenn der Aufwand nahezu vernachlässigbar ist.

                        Vor allem: Das Internet funktioniert nur deswegen so gut, weil sich praktisch alle Hersteller von Komponenten an den Grundsatz halten, beim Senden konservativ (sprich: den verabredeten Standard möglichst eng auslegend) vorzugehen, beim Empfangen aber möglichst liberal (sprich: die Funktion möglichst weitgehend hinzukriegen, auch wenn Idioten den Standard nicht korrekt verstanden haben).

                        Insofern ist das Festhalten an der Behauptung "funktioniert doch aber" ein eher als töricht zu bezeichnendes Vorgehen, weil es von allen Empfängern einfordert, sich gefälligst in diesem Punkt mal etwas weiter vom eigentlich nur notwendigen Standard zu entfernen.

                        - Sven Rautenberg

      2. Moin!

        <?

        if(!isset($_COOKIE["cookietest"])) {
            if($_GET["cookiecount"] < 2) {
                setCookie("cookietest","1");
                header("Location: ?cookiecount=" . (@(int)$_GET["cookiecount"] + 1));
            }else{
                header("Location: nocookies.php");
            }
        }
        ?>

        
        >   
        > so würde ichs machen.  
          
        Vom Funktionsprinzip OK, aber @-Zeichen zur Fehlerunterdrückung haben in PHP-Code nix verloren.  
          
        Details:  
          
        1\. Der Shop wird eine PHP-Session benutzen, also sollte man anstatt irgendeines "Cookietest" genannten Cookies direkt den benutzten PHP-Session-Namen testen. Mehr als ein Cookie benötigt man ja nicht, allein schon um den Traffic zu minimieren.  
          
        2\. Redirect-URLs im Location-Header müssen immer absolut sein, also inkl. Protokoll, Domain und Pfad.  
          
        3\. Auch wenn das Casten in einen Integer für den Counter im Kontext der URL korrekte Ergebnisse erzielt, ist mir bei sowas doch wohler, wenn alles, was in die URL wandert, via rawurlencode() escaped wird.  
          
        4\. Dein Code produziert trotzdem eine Notice wegen $\_GET['cookiecount']...  
          
          
         - Sven Rautenberg
        
    2. Moin!

      es geht um einen kleinen Shop, der einen Cookie braucht für den Warenkorb. Nun ist es ja so, dass beim ersten Aufruf der Seite, egal welche Unterseite, der Cookie erst zum Browser geschickt wird, der Cookie ist frühestens beim Aufruf einer zweiten Seite am Server lesbar.

      Man wird in der Regel den Cookie-losen Aufruf erkennen und deshalb in dieser Antwort sowohl Cookie als auch ein Redirect auf dieselbe Seite setzen (ggf. ergänzt um einen URL-Parameter, der als Counter die Anzahl erfolgter Redirects angibt, damit man eine entstehende Endlosschleife am Ende mit einem Hinweistext abbrechen kann).

      Interessante Idee. Mit einem automatischen Redirekt (wohin wäre noch zu klären) hätte ich jedoch frühestens erst beim 'Hinzufügen eines Artikels zum Warenkorb' die Möglichkeit, dem Kunden zu erklären, dass er den Cookie bitte annehmen möchte. Ist aber wert, darüber nachzudenken.

      Hotti

  3. Guten Abend,

    Gefragt ist ein benutzerfreundliches Design, ein zusätzlicher Menüpunkt, etwa 'Cookie testen' soll vermieden werden.

    Mit dieser Prämisse bleibt eigentlich nur Eines: Auf jeder Seite einen Hinweis einbauen, dass 'noch kein Cookie gestzt ist', dieser Hinweis verschwindet spätestens beim Aufruf einer zweiten Seite sofern der Browser Cookies dieser Domain akzeptiert, macht er das nicht, bleibt der Hinweis und beim Hinzufügen eines Artikels zum Warenkorb käme in diesem Fall eine etwas umfangreichere und unmissverständliche Fehlerseite.

    Also, ich habe jetzt beim Weiterentwickeln meines Mini-Shops (waraus durchaus ein Großer werden kann) natürlich auch oft genug den Browser geschlossen, geklickt wie ein Wilder und festgestellt (was meine Meinung widerspiegelt):

    Der kleine Hinweis 'Bitte Cookie annehmen' kommt nur beim ersten Aufruf (egal welche Bookmark) und könnte übersehen oder ignoriert werden (was darf). Der Hinweis ist ab dem zweiten Seitenaufruf weg und alles wird gut. Der Hinweis erscheint dauerhaft auf jeder Seite, wenn der Browser die Annahme des Cookies verweigert und fällt dann eher auf. Der Hinweis mutiert zu einer höflichen aber bestimmten Fehlermeldung, wenn versucht wird, ohne Cookie einen Artikel in den Warenkorb zu schmuggeln.

    Habt Ihr evntl. andere Vorschläge (außer auf Cookie verzichten)?

    Bestimmt ;)
    Hotti

    --
    eval die "Vielleicht?"; # Das Sterben will erst getestet werden