11. März 2013
.svgz-Dateien richtig ausliefern mit nginx
.svgz-Dateien sind mit gzip komprimierte .svg-Dateien ("Scalable Vector Graphics"). Beim Ausliefern von .svgz-Dateien kann es unter nginx zu Fehlern kommen - anstatt, daß das Bild angezeigt wird, wird im Browser eine Fehlermeldung gezeigt (Firefox: "XML Parsing Error: not well-formed", Chrome/Safari: "This page contains the following errors: error on line 1 at column 1: Encoding error Below is a rendering of the page up to the first error."). Das Problem kann leicht behoben werden.
Öffnen Sie /etc/nginx/mime.types...
vi /etc/nginx/mime.types
... und stellen Sie sicher, daß der folgende MIME-Type vorhanden ist:
image/svg+xml svg svgz;
Aktivieren Sie gzip und gzip_static in /etc/nginx/nginx.conf und stellen Sie sicher, daß der MIME-Type für .svg/.svgz-Dateien (image/svg+xml) in der Zeile gzip_types auftaucht, z.B. so:
vi /etc/nginx/nginx.conf
gzip on;
gzip_static on;
gzip_disable "msie6";
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js image/svg+xml;
gzip_buffers 16 8k;
Wenn Sie nginx jetzt neu laden...
/etc/init.d/nginx reload
... und versuchen, die .svgz-Datei zu laden, werden Sie immer noch den Fehler bekommen, ob wohl nginx die korrekten Header ausliefert:
Content-Type: image/svg+xml
Content-Encoding: gzip
Der Trick besteht jetzt darin, den Content-Encoding-Header für .svgz-Dateien einfach nochmal zu setzen, z.B. durch folgenden location-Container im entsprechenden Vhost:
location ~* \.svgz {
add_header Content-Encoding "gzip";
}
Danach muß nginx noch neu geladen werden:
/etc/init.d/nginx reload
Wenn Sie jetzt die .svgz-Datei in Ihrem Browser neu laden, ist der Content-Encoding-Header zwar doppelt gesetzt...
Content-Type: image/svg+xml
Content-Encoding: gzip, gzip
... aber die Datei wird im Browser korrekt angezeigt.