hotti: If-Modified-Since und SEO

Moin,

bei google hab ich gelesen "stellen Sie sicher, dass Ihr Server If-Modified-Since unterstützt" u. weiter: "Sie sparen dadurch Bandbreite..."

Also, ich hab das nicht so ganz verstanden und auch eine andere Sache nicht in diesem Zusammenhang, da las ich neulich, dass eine Suchmaschine anhand dieser Headergeschichten erkennt, ob eine Seite dynamisch erzeugt wird oder als Datei vorliegt.

Und jetzt meine Fragen dazu:

Kann es sein, dass google & Co nicht gerne kommt, wenn die Seiten dynamisch erzeugt werden, weil die da jedesmal die komplette Seite neu requesten müssen?

Das ist dann wohl so, dass google & Co gerne schon anhand des Headers sehen will, obs was Neues auf der Site gibt?

Wird so ein (google & Co)-freundlicher Header nur erzeugt, wenn HTML-Seiten auch als Datei vorliegen?

Oder: Wie kann ich Letzteres selbst beeinflussen und überhaupt: Wie sieht denn so ein header aus, von einem Server, der "If-Modified-Since" unterstützt?

Viele Grüße,
Horst

--
Hotti is dof.
  1. Lieber hotti,

    --
    Hotti is doof

    wirklich?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Hallo,

    bei google hab ich gelesen "stellen Sie sicher, dass Ihr Server If-Modified-Since unterstützt" u. weiter: "Sie sparen dadurch Bandbreite..."

    ja, mag durchaus sein. Man schafft dadurch die Möglichkeit, dass der Client nicht stur die Seite X anfordert, sondern sagen kann: "Ich habe Seite X vom 17.07.2009 22:48h im Cache und brauch jetzt die aktuelle."  Und dann antwortet der Server entweder mit Status 304 Not Modified, wenn die Version beim Client noch aktuell ist, oder er liefert eben die komplette Seite mit Status 200 aus (das tut er auch, wenn er den If-Modified-Since-Header nicht kennt oder auswertet).
    Man spart also Bandbreite, indem man gecachte Versionen einer Ressource verwendet, *wenn* die noch aktuell sind, und dennoch nicht "blind" auf den Cache vertraut.

    Also, ich hab das nicht so ganz verstanden und auch eine andere Sache nicht in diesem Zusammenhang, da las ich neulich, dass eine Suchmaschine anhand dieser Headergeschichten erkennt, ob eine Seite dynamisch erzeugt wird oder als Datei vorliegt.

    Kann ich mir nicht vorstellen. Dieser "Conditional Request" und auch die Reaktion des Servers darauf ist nicht davon abhängig, ob die Seite ststisch oder dynamisch erzeugt wird.

    Kann es sein, dass google & Co nicht gerne kommt, wenn die Seiten dynamisch erzeugt werden, weil die da jedesmal die komplette Seite neu requesten müssen?

    Keine Ahnung, frag Google.

    Oder: Wie kann ich Letzteres selbst beeinflussen und überhaupt: Wie sieht denn so ein header aus, von einem Server, der "If-Modified-Since" unterstützt?

    Siehe oben. Apache reagiert standardmäßig so.

    Schönes Wochenende,
     Martin

    --
    Viele Fachleute vertreten die Ansicht, jedes Feature eines Programms, das sich nicht auf Wunsch abstellen lässt, sei ein Bug.
    Außer bei Microsoft. Da ist es umgekehrt.
    1. hi,

      Also, ich hab das nicht so ganz verstanden und auch eine andere Sache nicht in diesem Zusammenhang, da las ich neulich, dass eine Suchmaschine anhand dieser Headergeschichten erkennt, ob eine Seite dynamisch erzeugt wird oder als Datei vorliegt.

      Kann ich mir nicht vorstellen. Dieser "Conditional Request" und auch die Reaktion des Servers darauf ist nicht davon abhängig, ob die Seite ststisch oder dynamisch erzeugt wird.

      Konkret verstehe ich das so:

      UA(egal) steckt in den Request-Header die Frage:
      "If-Modified-Since: date_time_x"
      wobei date_time_x das Datum+Uhrzeit ist, was UA im Cache hat, weil UA die Seite schonmal requestet hat vor einiger Zeit.

      Der Webserver, der das unterstützt, schreibt in den Header:
      "Last Modified: date_time_y"
      wobei er für y das Dateidatum nimmt, sofern es eine HTML-Datei ist, die direkt aus dem Dateisystem gezogen wird. Wurde jedoch ein CGI-Script requestet, was zur Laufzeit erzeugt wurde, ist dieses Header-Field nicht vorhanden (dynamischer Content).

      UA(egal): Mozilla, FF, IE, google & co...

      Hab ich das so richtig verstanden?

      Hotti

      --
      Same procedure as last year?
      1. Hallo,

        Dieser "Conditional Request" und auch die Reaktion des Servers darauf ist nicht davon abhängig, ob die Seite ststisch oder dynamisch erzeugt wird.

        UA(egal) steckt in den Request-Header die Frage:
        "If-Modified-Since: date_time_x"
        wobei date_time_x das Datum+Uhrzeit ist, was UA im Cache hat, weil UA die Seite schonmal requestet hat vor einiger Zeit.

        Richtig.

        Der Webserver, der das unterstützt, schreibt in den Header:
        "Last Modified: date_time_y"
        wobei er für y das Dateidatum nimmt, sofern es eine HTML-Datei ist, die direkt aus dem Dateisystem gezogen wird. Wurde jedoch ein CGI-Script requestet, was zur Laufzeit erzeugt wurde, ist dieses Header-Field nicht vorhanden (dynamischer Content).

        Diesen Header gibt er auch aus, wenn er das If-Modified-Since nicht versteht oder nicht verstehen "will".
        Das Entscheidende ist jedoch der HTTP-Status der HTTP-Response. Der ist "304 Not Modified", wenn der Server mitteilen will: Ja, deine gecachte Version ist noch aktuell, ich hab auch nichts neueres.
        Im anderen Fall sendet er ganz normal einen Status 200 und liefert die angeforderte Ressource aus.

        Durch diesen Mechanismus ist der Conditional Request vollständig abwärtskompatibel zu HTTP-Servern und -Clients, die das nicht kennen.

        Ciao,
         Martin

        --
        In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.
          (Dieter Nuhr, deutscher Kabarettist)
      2. hi,

        UA(egal) steckt in den Request-Header die Frage:
        "If-Modified-Since: date_time_x"
        wobei date_time_x das Datum+Uhrzeit ist, was UA im Cache hat, weil UA die Seite schonmal requestet hat vor einiger Zeit.

        Der Webserver, der das unterstützt, schreibt in den Header:
        "Last Modified: date_time_y"
        wobei er für y das Dateidatum nimmt, sofern es eine HTML-Datei ist, die direkt aus dem Dateisystem gezogen wird. Wurde jedoch ein CGI-Script requestet, was zur Laufzeit erzeugt wurde, ist dieses Header-Field nicht vorhanden (dynamischer Content).

        Vergleich doch mal die ganz einfachen Header-Ausgaben deiner Seite, die gesendet werden:

        Startseite

        Date: Sat, 18 Jul 2009 09:17:15 GMT
        Server: Apache
        Last-Modified: Fri, 17 Jul 2009 18:56:44 GMT
        Etag: "285ea8c1-121c-46eeb597b52c9"-gzip
        Accept-Ranges: bytes
        Vary: Accept-Encoding
        Content-Encoding: gzip
        Content-Length: 1822
        Connection: close
        Content-Type: text/html

        http://rolfrost.de/cgi-bin/news.cgi

        Date: Sat, 18 Jul 2009 09:18:46 GMT
        Server: Apache
        Cache-Control: no-cache;
        Pragma: no-cache;
        Vary: Accept-Encoding
        Content-Encoding: gzip
        Content-Length: 5515
        Connection: close
        Content-Type: text/html;

        Ich gehe mal stark davon aus, dass die Startseite eine Statiche Ressource ist.

        Jedenfalls kann man auf deinem Server den von Edgar beschriebenen Apache-Bug sehen, da dein Server zwar Etag und Last-Modified sendet, die Ressourcen aber immer neu ausgeliefert werden (Status 200), also keine 304-Not-Modified, auch für deine CSS (Header auslesen).

        Vielleicht hilft dir schon ein (ich weiss aber nicht, ob dass auch in Verbindung mit mod_deflate funktioniert, ich zippe meine Ressourcen mit PHP):

        <FilesMatch "\.(html|htm|jpg|jpeg|gif|png|mp3|flv|mov|avi|html|swf|css|js|ico)$">  
        ## Expires  
          ExpiresActive On  
          ExpiresDefault "access plus 10 years"  
        ## Etag  
          FileETag MTime Size  
        ## Cache-Control  
          Header set Cache-Control "public, no-transform"  
        </FilesMatch>
        

        mfg

        1. hi,

          Ich gehe mal stark davon aus, dass die Startseite eine Statische Ressource ist.

          Ja, alles was bei mir mit .html endet, sind echte Dateien ;-)

          [..] Apache-Bug sehen, da dein Server zwar Etag und Last-Modified sendet, die Ressourcen aber immer neu ausgeliefert werden (Status 200), also keine 304-Not-Modified, auch für deine CSS (Header auslesen).

          Schon gesehen, ja...

          Vielleicht hilft dir schon ein (ich weiss aber nicht, ob dass auch in Verbindung mit mod_deflate funktioniert, ich zippe meine Ressourcen mit PHP):

          Danke auch Dir, ich lasse erst mal alles so wie es ist. Aber eine Frage hab ich noch, das ist mir noch nicht ganz klar und beim TCP-Dumpen aufgefallen:

          Datum/Uhrzeit von "If-Modified-Since" (request) und "Last Modified" (response) sind absolut gleich, auch nachdem ich den Cache geleert habe. Wie läuft denn das im Einzelnen ab, das Header-Geschwätz? Gerne auch'n Link.

          Viele Grüße,
          Hotte

      3. Hi,

        Konkret verstehe ich das so:

        UA(egal) steckt in den Request-Header die Frage:
        "If-Modified-Since: date_time_x"
        wobei date_time_x das Datum+Uhrzeit ist, was UA im Cache hat, weil UA die Seite schonmal requestet hat vor einiger Zeit.

        Der Webserver, der das unterstützt, schreibt in den Header:
        "Last Modified: date_time_y"

        Ja, nur eben "anders herum".

        Der Server hat die Ressource bei der ersten Anfrage durch den Client mit einem Last-Modified-Header (neben ggf. weiteren das Caching beeinflussenden) ausgeliefert.

        Der Nutzer fordert die Seite jetzt erneut an; Client schaut in seinen Cache und merkt, die hab' ich eigentlich schon. Also frag ich mal beim Server nach, ob die sich inzwischen geändert hat - dazu dient If-Modified-Since:
        "Hey Server, mein Nutzer interessiert sich für Ressource /XY, aber ich hab da noch eine Version in meinem Cache liegen, von der du mir gesagt hast, dass sie am 18.7.2009 um 17:03:47 Uhr zuletzt geändert wurde. Hat die sich inzwischen geändert? Wenn nein, sag bitte nur kurz Bescheid [304 Not Modified], dann zeig ich dem Typ vorm Bildschirm einfach die Version, die ich noch auf Halde liegen habe, merkt der Pinsel doch eh nich'. Falls du aber was neues hast, dann lass das gleich mal rüberwachsen."

        wobei er für y das Dateidatum nimmt, sofern es eine HTML-Datei ist, die direkt aus dem Dateisystem gezogen wird. Wurde jedoch ein CGI-Script requestet, was zur Laufzeit erzeugt wurde, ist dieses Header-Field nicht vorhanden (dynamischer Content).

        Das liegt am Server/Script, wie er/es den Zeitpunkt der letzten Änderung ermitteln will (oder auch nicht).
        Last-Modified enthält bei Dateien in der Regel wirklich nur den letzten Änderungszeitpunkt, den das Dateisystem hergibt. (Beim ETag ist das anders, da fliessen per Default noch Sachen wie der INode etc. mit ein.)

        Aber natürlich kann ein Script, was Daten bspw. aus einer Datenbank ausliest und darüber idealerweise ebenfalls einen letzten Änderungszeitpunkt zur Verfügung hat, natürlich auch entsprechende Angaben an den Client senden und Requests nach noch nicht "veralteten" Ressourcen mit einem 304 beantworten, um Traffic zu sparen. Nur muss man das bei Scripten i.a.R. selber implementieren.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. hi Chris,

          Donnerwetter, das hast Du aber sehr schön erklärt, vielen Dank!!!

          Btw., hab grad ebend mal eine Datei geändert und mir die Dumps angeschaut, im Vergleich mit dem anderen Kram, den ich nicht geändert habe. Wieder was dazugelernt.

          Aber natürlich kann ein Script, was Daten bspw. aus einer Datenbank ausliest und darüber idealerweise ebenfalls einen letzten Änderungszeitpunkt zur Verfügung hat, natürlich auch entsprechende Angaben an den Client senden und Requests nach noch nicht "veralteten" Ressourcen mit einem 304 beantworten, um Traffic zu sparen. Nur muss man das bei Scripten i.a.R. selber implementieren.

          Ja Freilich. Aber das Beste ist, so wie Eddi geschrieben hat, statischen Content aus statischen Seiten herauszuholen, sofern der Server keine Macke hat, ist das performant, suchmaschinen- und benutzerfreundlich, kurz und gut, gut. Klar kann ich HTML-Content auch aus ner MySQL-Büchse zaubern und hab da automatisch die Möglichkeit der Volltextsuche. Aber irgendwie ist das Overheadig und wenn, so wie bei meinem Provider, der MySQL-Server eine andere Maschine ist wie der Webserver, ist das ja schon der Overkill ;-)

          Zumal da noch ne Firewall dazwischenhängt, die eine Drittfirma managed. Mann, was baue ich manchmal fürn Scheis, nur um der Technik willen ;-)

          Meine Volltextsuche (find.cgi) sitzt seit gestern auf einer Berkeley-DB, das ist eine Datei, die Perl mit tie() an einen Hash bindet und das flutscht wie die Waldwutzn; ebenso wie auch der FileTransfer mit dem neuen Kabelanschluss, den ich seit Mittwoch habe...

          Viele Grüße,
          Horst

          --
          Ab ins Bad, Zähne putzen, rasieren und dann ins Wochenende :-)
    2. Hallo,

      Also, ich hab das nicht so ganz verstanden und auch eine andere Sache nicht in diesem Zusammenhang, da las ich neulich, dass eine Suchmaschine anhand dieser Headergeschichten erkennt, ob eine Seite dynamisch erzeugt wird oder als Datei vorliegt.

      Kann ich mir nicht vorstellen. Dieser "Conditional Request" und auch die Reaktion des Servers darauf ist nicht davon abhängig, ob die Seite ststisch oder dynamisch erzeugt wird.

      jain. Prinzipiell hast Du recht. Die meisten Scripte scheren sich aber nicht um das Erzeugen eines Last-Modified-Response-Headers oder/und um die Verarbeitung eines If-Modified-Since-Request-Headers. Das macht aber, wie ich unten noch schreibe, Sinn.
       Somit kann man mit (zumindest) großer Wahrscheinlichkeit davon ausgehen, dass ein fehlender Header Last-Modified einer Ressource aus einer dynamischen Erzeugung herrührt.

      Kann es sein, dass google & Co nicht gerne kommt, wenn die Seiten dynamisch erzeugt werden, weil die da jedesmal die komplette Seite neu requesten müssen?

      Meines Wissens schweigen sich die Suchmaschinen darüber aus und lassen sich nicht in die Karten gucken.

      ...Wie kann ich Letzteres selbst beeinflussen ...

      Es ist vorallem die Frage, ob Du dies beeinflussen solltest. Denn es hat doch einen Grund, ein Script statt eines statischen Dokuments einzusetzen. Dynamische Inhalte reagieren auf die angelieferten Daten einer Anfrage. Sei dies nun im Falle von CGI-Scripten die HTTP_[VAR-NAME] oder direkte Eingaben in Form fon GET-, Post- oder PUT-Daten. Oder kurz: Jede Anfrage kann andere Inhalte zurückgesandt bekommen. Somit ist die Hin- und Herübertragung von If-Modified-Since-Header und Last-Modified-Headers over head, da sich schlichtweg keine Aussage über den gleichbleibenden Inhalt anhand des Modifizierungsdatums herleiten lässt. In dem Sinne ist die eigentliche Frage nicht, wie man Scripte suchmaschinengerecht aufmotzt, sonder wie man seine Projekte so vernünftig Strukturiert, das gleichbleibende Inhalte statisch serviert werden.

      (So, und wo subsumiert man das jetzt? HTTP? Projektverwaltung?)

      Gruß aus Berlin!
      eddi

      --
      Frei nach z1626: Was wir brauchen ist eine neue Aufklärung - eine "Aufklärung 2.0" wenn man so will.
      Wie sieht es bsw. mit Strafverfolgung der Bundesregierung nach § 154 StGB für jedes von Karlsruhe kassierte Gesetz aus? Wurde sie etwa nicht auf das Grundgesetz eingeschworen?
      1. hi Eddi,

        [..] In dem Sinne ist die eigentliche Frage nicht, wie man Scripte suchmaschinengerecht aufmotzt, sonder wie man seine Projekte so vernünftig Strukturiert, das gleichbleibende Inhalte statisch serviert werden.

        Genau. Diese Frage ist mir schon länger beantwortet, nur ein paar Kleinigkeiten zu Details, auf die ich bei meinen letzten Recherchen gestoßen bin, haben noch gefehlt.

        Danke und viele Grüße an Alle,
        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.