4 Stimmen

Website 5x schneller durch mod_rewrite, aber CSS-Bilder sind kaputt

Ich verwende .htaccess, um eine Website mit den folgenden Weiterleitungen zu beschleunigen:

request for http://example.com/images/name.jpg  routed to  http://i.example.com/name.jpg
request for http://example.com/css/name.css     routed to  http://c.example.com/name.css

Im Stack Overflow-Podcast habe ich erfahren, dass dies eine Website schneller machen kann, da der Browser kann mehrere Dateien gleichzeitig herunterladen (anscheinend zwei Ströme pro Bereich, obwohl dies nicht bestätigt ist).

Der Unterschied ist in der Tat dramatisch; die Seite lädt etwa fünfmal so schnell ¡!

Ich habe die Originalordner und -bilder nicht angefasst - ich verwende nur mod_rewrite, um die Adressen von beispiel.com/bilder/ a i.example.com/ :

rewritecond %{HTTP\_HOST}     !^i\\.example\\.com       \[NC\]
rewriterule ^images/(\[^/\]+)$ http://i.example.com/$1 \[L\]
rewritecond %{HTTP\_HOST}     !^c\\.example\\.com       \[NC\]
rewriterule ^css/(\[^/\]+)$    http://c.example.com/$1 \[L\]

Das Problem, das ich habe, ist, dass diese Technik perfekt für Bild-Tags funktioniert, die in HTML enthalten sind, aber nicht für Bilder, die über Stylesheets enthalten sind:

img src=/bilder/logo.jpg funktioniert perfekt

Hintergrund:url(/images/logo.jpg); funktioniert nicht

Das Server-Fehlerprotokoll enthält den folgenden Eintrag:

Die Datei existiert nicht: /var/www/html/css/images, referer: http://example.com/page.html

Dies scheint darauf hinzudeuten, dass die Rewrite-Regel nicht korrekt angewendet wird.

Die Stylesheets funktionieren, wenn ich verwende:

Hintergrund:url( http://i.example.com/logo.jpg );

Um jedoch zu vermeiden, dass alle Formatvorlagen neu geschrieben werden, würde ich das gerne wissen: warum gilt url rewriting nicht für Stylesheets wie für html img tags .

[update1] Dieses Problem besteht in Safari 4 Beta, Firefox 3.0.3 und Chrome, aber die Die Seite funktioniert perfekt im IE6 .

[update2] Die Hinzufügung von [L,R=301] und [L,R=302] hat nicht geholfen.

[update3] Auf der Grundlage von Gumbos Vorschlag habe ich Folgendes ausprobiert:

Externe Umleitung, wenn der Pfad nicht mit dem Hostnamen übereinstimmt:

rewritecond %{HTTP_HOST}     !^i\.domain\.com$
rewriterule ^images/([^/]+)$ http://i.domain.com/$1 [L,R=301]
rewritecond %{HTTP_HOST}     !^c\.domain\.com$
rewriterule ^css/([^/]+)$    http://c.domain.com/$1 [L,R=301]

Leiten Sie intern um; wenn es einen unnötigen Ordnernamen gibt, entfernen Sie ihn (siehe Serverfehler oben):

rewritecond %{HTTP_HOST}     ^i\.domain\.com$
rewriterule ^images/([^/]+)$ $1 [L]
rewritecond %{HTTP_HOST}     ^c\.domain\.com$
rewriterule ^css/([^/]+)$    $1 [L]

Es hat trotzdem nicht geklappt. Bizarrerweise ist der Server-Fehler:

Die Datei existiert nicht: /var/www/html/css/var, Referer: http://domain.com/page.html

1voto

Andrew Swift Punkte 2137

Ich konnte dieses Problem wie folgt lösen nicht versuchen, Verzeichnisse in die Subdomains einzubinden :

request for domain.com/images/  routed to  i.domain.com/images/
request for domain.com/css/     routed to  c.domain.com/css/

Es funktioniert perfekt und ist immer noch extrem schnell .

Es scheint eine Fehler in modernen Browsern, wo eine umgeleitete CSS-Anfrage nur den neuen Bereich anwenden und belässt die ursprünglichen Verzeichnisse als Teil der Anfrage:

Wenn ein css-Bild bei url(domain.com/images/name.jpg) wird umgeleitet zu i.domain.com/name.jpg wird der Browser fälschlicherweise Folgendes anfordern i.domain.com/images/name.jpg .

1voto

Gumbo Punkte 617646

Ich habe eine Möglichkeit gefunden, dieses Problem zu lösen, wenn alle Hostnamen denselben virtuellen Host verwenden:

# redirect externally if path doesn’t match host name
RewriteCond %{HTTP_HOST} !^i\.example\.com$
RewriteRule ^images/([^/]+)$ http://i.example.com/$1 [L,R=301]
RewriteCond %{HTTP_HOST} !^c\.example\.com$
RewriteRule ^css/([^/]+)$ http://c.example.com/$1 [L,R=301]

# redirect internally to the file
RewriteCond %{HTTP_HOST} ^i\.example\.com$
RewriteRule !^images/ images%{REQUEST_URI} [L]
RewriteCond %{HTTP_HOST} ^c\.example\.com$
RewriteRule !^css/ css%{REQUEST_URI} [L]

Damit wird Folgendes erreicht:

http://example.com/css/foo       externally to    http://c.example.com/foo
http://c.example.com/foo         internally to    /css/foo

http://example.com/images/bar    externally to    http://i.example.com/bar
http://i.example.com/bar         internally to    /images/bar

Außerdem werden nicht übereinstimmende Pfade und Hostnamen korrigiert:

http://i.example.com/css/foo     externally to    http://c.example.com/foo
http://c.example.com/images/bar  externally to    http://i.example.com/bar

Eine Fehlanpassung tritt auf, wenn das angeforderte Stylesheet http://example.com/css/foo wird umgeleitet zu http://c.example.com/foo und eine Bild-URI-Referenz wie /images/bar innerhalb des Stylesheets wird von diesem neuen Basis-URI aufgelöst und führt somit zu http://c.example.com/images/bar anstelle der ursprünglichen http://example.com/images/bar .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X