Apache

htaccess Snippets

Umleiten, falls Hostname ohne www. aufgerufen wird:

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]

Lange Expire-Header für Mediafiles:

<FilesMatch "\.(css|js)$">
   ExpiresActive On
   ExpiresDefault "access plus 10 years"
</FilesMatch>

Ajax Requests nicht im Browser Cachen lassen:

<IfModule mod_headers.c>
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
    Header set Pragma "no-cache"
    Header set Cache-Control "max-age=0, no-cache, no-store, \
        must-revalidate, post-check=0, pre-check=0"
    Header unset Etag
</IfModule>

Mediafiles gzipped ausliefern (gut kombinierbar mit Expire-Header s.o.):

<FilesMatch "\.(css|js)$">
   SetOutputFilter DEFLATE
</FilesMatch>

Alle Requests auf einen zentralen Dispatcher umleiten:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* dispatch.php [L,QSA]
# or
RewriteRule ^(.*)$ /app.wsgi/$1 [L,QSA]

Rewrites nur für nicht eingeloggte User:

RewriteCond %{HTTP_COOKIE} !sessionid=.*

Apache überzeugen einen UTF-8 Content-Type-Header zu senden:

AddDefaultCharset utf-8

mod_proxy

Wenn mod_proxy keine Proxy-Requests ([p]) ausführt fehlt evtl. das Modul mod_proxy_http. (Gibt leider keine Fehlermeldung, sondern wird einfach nicht ausgeführt.)

Content-Negotiation

Um Apache entscheiden zu lassen welche Sprachversion ausgeliefert wird, einfache z.B. zwei Dateien index.html.de und index.html.en anlegen. In der .htaccess dann MultiViews aktivieren:

Options +MultiViews

Ein Aufruf von index.html liefert dann die Version aus, die zum Accept-Language Header des Clients passt. Soll nicht die englische ausgeliefert werden, wenn keine passende Sprache gefunden wurde, kann man eine andere Sprache als Default festlegen:

LanguagePriority de

Will ein Besucher, dessen Browser auf Deutsch eingestellt ist trotzdem die englische Seite sehen, muss er einen Link anklicken, wenn dieser Link nicht auf index.html.en zeigen soll, kann man mod_rewrite benutzen:

RewriteEngine On
RewriteRule ^en/?$ /index.html.en [L]
RewriteRule ^de/?$ /index.html.de [L]

Der Slash am Ende ist in diesem Fall sogar optional, dies führt zwar zu einer doppelten URL, erhöht aber die Userfreundlichkeit. Man könnte hier noch so weit gehen die URL mit oder ohne Slash auf die jeweils andere Umzuleiten, wenn unbedingt notwendig.

Es ist zwar grundsätzlich möglich die Dateien auch index.de.html bzw. index.en.html zu bennen, aber man kann sie dann nicht als index.html oder index.en öffnen:

If you want to continue to use a MIME-type in your hyperlinks (e.g. foo.html) the language extension (including an encoding extension if there is one) must be on the right hand side of the MIME-type extension (e.g., foo.html.en).