Problem mit expire date und gzip bei Apache Server

shredder01

New Member
Hallo,

ich versuche gerade einige Webseiten hinsichtlich Ladezeiten u.ä. zu optimieren.
Unter anderem habe ich jetzt mit dem Expire-Header experimentiert und lasse die soweit wie sinnvoll gezippt ausliefern. Dabei ist mir aufgefallen das ein paar Javascriptdateien beides ignorieren. Sie werden scheinbar ohne Expire Date ausgeliefert und werden auch nicht komprimiert.
Kann mir einer einen Tipp geben woran das liegen könnte?
Eine der fraglichen Webseiten ist das hier http://www.ernaehrungsberatung-stralsund.de/.
Meine erste Vermutung war, das vielleicht an den "?ver..." Anhängseln, die das CMS den Dateien verpasst, liegen könnte, aber da zweifel ich inzwischen schon wider dran, da eine der sich weigernden JS-Dateien kein solches Anhängsel besitzt.

Folgendes steht in der mod_deflate.conf, die in /etc/apache2/conf.d liegt:
Code:
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml application/rss+xml
AddOutputFilterByType DEFLATE text/css text/javascript application/javascript application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
Und folgendes steht in der .htaccess:
Code:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 2 hours"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/ico "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"
</IfModule>
Hm, hab ich noch etwas vergessen?
Die entsprechenden Module (mod_deflate und mod_expires) sind aktiviert.

Aber ich denke nicht das es an der Konfiguration des Servers liegt, da beides (Expire Date setzen und komprimieren) ja generell funktioniert. Alles andere außer 3 bzw. 4 Dateien macht genau das was ich will. Nur bei diesen Dateien will es einfach nicht funktionieren, wie mir YSlow zeigt.

Vielen Dank schon mal.

P.S.: Habe die Frage vor 4 Tagen, ohne Erfolg, auch hier http://www.tutorials.de/forum/hosting-webserver/350019-expire-date-und-gzip-werden-von-einigen-dateien-ignoriert.html gepostet.
 
Sie werden scheinbar ohne Expire Date ausgeliefert
Das mit dem "scheinbar" ist eine schlechte Formulierung. Ja oder Nein?
Nutze die Netzwerk-Option von Firebug. Damit kannst Du Dir den Response-Header von jeder nachträglich Datei ansehen.

Wirklich vorbildliches Verhalten!
Zum Einen Infos und Link gepostet, und zum Anderen ein paar Anstandstage abgewartet.
Wenn sich nur alle daran halten würden...

huschi.
 
Das mit dem "scheinbar" ist eine schlechte Formulierung. Ja oder Nein?
Hm, ok ... also die Netzwerkoption von Firebug zeigt mir bei den Problemdateien bei Expires das aktuelle Datum und die aktuelle Uhrzeit plus eine Stunde an.
D.h. alle Expire-Anweisungen aus der .htaccess werden ignoriert (selbst wenn die Dateiart nicht erkannt werden sollte müßte ja wenigstens der ExpireDefault-Wert gelten).
YSlow meldet:
There are 4 static components without a far-future expiration date.
Wie ist das beim gzip? Läßt sich das auch im Header erkennen?
Was ich da erkennen kann ist folgendes: Im Anfrage-Header habe ich immer
Code:
Accept-Encoding	gzip,deflate
und im Antwort-Header dann jeweils
Code:
Vary	Accept-Encoding
... allerdings fehlt diese Zeile in den Antwort-Headern der "Problemdateien".
 
Tschuldige die blöden Fragen, aber sie sind zu wichtig um nicht gestellt zu werden:
Das mod_expires ist aber wirklich eingebunden? (apache2ctl -M)
Die Expires-Directiven dürfen in der htaccess gesetzt werden? (error_log bzw. Override indexes)

huschi.
 
  • http://www.ernaehrungsberatung-stralsund.de/wp-includes/js/jquery/jquery.js?ver=1.3.2
  • http://www.ernaehrungsberatung-stralsund.de/wp-content/plugins/cforms/js/cforms.js
  • http://www.ernaehrungsberatung-stralsund.de/wp-content/plugins/smooth-slider/js/stepcarousel.js?ver=2.8.4
geben "Content-Type: text/x-js" zurück - was Deine Liste nicht abdeckt.

  • http://www.ernaehrungsberatung-stralsund.de/wp-content/themes/ebs2-theme/js/iepngfix.htc
ist text/plain (steht nicht bei Expire).

  • http://www.ernaehrungsberatung-stralsund.de/wp-content/themes/ebs2-theme/form.css
existiert nicht :rolleyes:
 
@huschi: Ja, von der Seite stimmt alles und wie schon geschrieben funktioniert ja beides (mod_expires und mode_deflate) auch generell ...nur nicht bei diesen Dateien.

@Whistler:Na ganz toll :rolleyes: ... auf alles mögliche hab ich geachtet, sogar nachträglich noch ExpiresByType text/javascript hinzugefügt, aber das war mir entgangen. Danke für den Hinweis!
Hm, aber was ich noch nicht verstehe: Müßte für diese Dateien nicht eigentlich der ExpiresDefault-Wert gelten?
Zweite Frage: Ich verstehe noch nicht ganz wie dieser Content-Type zustande kommt. Beim Einbinden dieser Dateien sage ich ja type="text/javascript" ...
Hier http://www.zahntechnik-greifswald.de/entwurf/kontakt/ z.B. habe ich ähnliche Probleme und da gibt es sogar JavaScript-Dateien, die laut Netzwerkoption von Firebug gar keinen Content-Type zurückgeben.

P.S. Ok, wie es scheint (laut Google-Recherche;) ) wird der Content-Type wohl vom Server festgelegt. Ich hab mal eben auf meinem Server etwas geforscht, aber ich kann irgendwie nicht erkennen wo der Content-Type für JavaScript-Dateien auf text/x-js gesetzt wird. In /etc/apache2/mime.types steht application/javascript js, in mod_mime-default.conf wird dazu nichts überschrieben und in der httpd.conf erfolgt auch keine zusätzliche Eintragung zu JavaScript.
Wo könnte das noch passieren? Oder bin ich hier sogar völlig falsch?
 
Last edited by a moderator:
Beim Einbinden dieser Dateien sage ich ja type="text/javascript" ...
Der Content-Type (wenn nicht von einem Server-Script gesetzt) wird aus dem MIME-Type bzw. der Extension gebildet. Es hat rein gar nichts damit zu tun, was Du irgendwo im HTML setzt.

da gibt es sogar JavaScript-Dateien, die laut Netzwerkoption von Firebug gar keinen Content-Type zurückgeben.
Welche 2 der 7 oder 8?

aber ich kann irgendwie nicht erkennen wo der Content-Type für JavaScript-Dateien auf text/x-js gesetzt wird.
Das ist ein Default-Wert der aus "x-" und der Extension gebildet wird, wenn er keinen passenden MIME-Type ermitteln kann.
Soweit ich das sehe betrifft es die Dateien mit "?ver=...".

PS: Wenn die Expires-Einstellungen in der .htaccess stehen bleiben sollen (besser in die Apache-Conf packen!), dann würde ich Dir die effizientere Schreibweise mit "A"+Sekunden empfehlen.
Nicht so übersichtlich, aber für den Apache schneller zu parsen.

huschi.
 
Last edited by a moderator:
Ok, die Geschichte mit gar keinem Content-Type muß ich wohl zurücknehmen. Das scheint wohl bloß nicht mehr angezeigt zu werden, wenn die Datei schon im Cache ist. Da war ich zu voreilig.

Soweit ich das sehe betrifft es die Dateien mit "?ver=...".
Nicht nur. Es betrifft auch die cforms.js und die hat z.B. kein ?ver... dahinter.

Ok, wenn ich text/x-js zu meinen Anweisungen hinzufüge, werden auch die Problemdateien ordentlich verarbeitet. Prima.


Wenn die Expires-Einstellungen in der .htaccess stehen bleiben sollen (besser in die Apache-Conf packen!), dann würde ich Dir die effizientere Schreibweise mit "A"+Sekunden empfehlen.
Ja, hatte ich auch noch vor. Es war nur jetzt in der Experimentierphase einfach leichter mit den "verständlichen" Werten herumzuhantieren.

Bleibt noch eine Frage übrig: Warum wird für diese Dateien nicht der ExpiresDefault-Wert genommen? Der müßte doch eigentlich dann für alles gelten was nicht extra aufgeführt ist, oder?
 
Last edited by a moderator:
Ich bin nochmal durchgegangen:
Es betrifft wohl alle .js von Deinem Server. Denn die anderen kommen von Google.

huschi.
 
Blöde Frage: jquery.js?ver=1.3.2 sieht mir sowieso komisch aus.
Ist das vielleicht gar keine statische Datei, sondern ein CGI, welches Javascript als Ausgabe hat?
Dann würden auch die Header vom CGI generiert (vielleicht von einer PHP-Bibliothek).
 
Nein, das machen viele Frameworks so.
Der Hintergrund ist, dass bei einem Software-Update die neue Version als Parameter übergeben wird. Das garantiert das Neuladen der Datei ganz unabhängig von allen Expire- und Proxy-Einstellungen.

Denn nichts ist schlimmer als die Fehlersuche nach einem Fehler der ganz allein auf einen Cache basiert... :(

PS: Nur weil ein Parameter übergeben wird, heißt das noch lange nicht, dass er auch ausgewertet wird.

huschi.
 
Ja, stimmt. Das ist bei vielen Frameworks so.

Was ich noch nicht nachvollziehen kann:
1. Warum hat er auch mit der cforms.js Probleme auch wenn die kein angehängtes "?ver..." hat?
2. Warum wirkt das ExpiresDefault nicht bei diesen Dateien?

Ansonsten vielen Dank an Euch beide für die Hilfe.
 
zu 1) Hatte ich oben gesagt: ALLE .js-Dateien von Deinem Server.
zu 2) Lässt sich so gar nicht bestätigen. Kannst Du nicht mal einen anderen Wert als Default eintragen?
Denn wenn ich jetzt (21:14) die Seite aufrufe erhalte ich einen Expires von "...21:14 GMT".
Je nach Deinen locales-Einstellungen (z.B. Sommerzeit oder nicht, oder oder oder) kann diese Angabe (aus Sicht des Servers) tatsächlich "+2h" bedeuten.

huschi.
 
@Huschi: Hm, ok bei Punkt 2 hast Du wohl recht. Ich hab mal die Extra-Anweisung für text/x-js rausgenommen und den Defaultwert auf 5 Stunden erhöht, womit sich dann der angezeigte Expire-Wert auch erhöht hat.
Womit bekomme ich die aktuelle Serverzeit heraus? Mit
Code:
date +%H.%M.%S
bekomme ich auf dem Server genau dieselbe Zeit angezeigt, die ich auch bei mir hier auf dem heimischen PC habe.
zu 1) Hatte ich oben gesagt: ALLE .js-Dateien von Deinem Server.
Hm, das wurmt mich schon. Selbst wenn jetzt mit der zusätzlichen Eintragung von text/x-js alles funktioniert, ist das ja irgendwie nicht in Ordnung.
Woran könnte das eventuell liegen, das alle JavaScript-Dateien auf meinem Server nicht korrekt erkannt werden?
Kann man wahrscheinlich wieder so pauschal nicht sagen, oder?
 
Back
Top