Guenter: Language-Negotiation, htaccess uns HTTP-Response-Codes

Beitrag lesen

Hallo Forum,

da ich mich in letzter Zeit vermehrt mit ModRewrite und HTTP-Codes beschaeftigt habe, wuerde ich hier gerne einmal fachmaennisch ueberpruefen lassen, ob ich alles korrekt umsetze oder doch noch ein paar Verstaendnisprobleme habe.

Primaer gehts es um Language-Negotiation, aber auch um Standard-Requests.
In meinem Beispiel benoetigt die Seite example.org stets eine Sprachangabe in Form von example.org/de - eine Root-Seite ohne Sprachangabe existiert folglich nicht.

Nochmal zur Uebersicht die HTTP-Response-Codes:
200 - OK
301 - moved permanently
302 - found
404 - not found
403 - forbidden

1. Initial, ohne Sprach-ISO
example.org --> 301 --> example.org/en
Hierbei wird die Client-Sprache ausgelesen.
Ist das OK wenn keine tatsaechliche Root-Seite existiert (also nur ausschlieszlich mit Sprach-ISO)?

2. Normal, mit gueltigem Sprach-ISO
example.org/en --> 200
Alles fein.

3. Mit falscher/keiner Sprache
example.org/ws/test --> 301 --> example.org/en/ws/test --> 404
Da der Server keine gueltige Sprache findet, fuegt er sie hinzu (auch hier wird Client ausgelesen).
Anschlieszend wird festgestellt, dass die Seite nicht existiert.
Hier wuerde ich gerne bereits beim ersten Redirect (mittels PHPs header) einen 404er als Code angeben, aber das fuehrt zu Problemen, da der Apache an dieser Stele den Request bereits abgearbeitet hat und die ErrorDocument-Angaben somit auszer Kraft gesetzt wurden.

4. Zugriff auf existierenden Ordner
example.org/gui --> 301 --> example.org/gui/ --> 403
Apache erkennt, dass gui ein existierender Ordner ist und fuegt den abschlieszenden Slash hinzu, anschlieszend wird ein forbidden geschmissen

5. Zugriff auf nicht existierenden Ordner
Identisch mit Punkt 3.

6. Zugriff auf existierendes File
example.org/gui/images/test.png --> 200

7. Zugriff auf nicht existierendes File
example.org/gui/images/test2.png --> 404

Und hier meine .htaccess

RewriteEngine on
RewriteBase "/"

Trailing Slashes entfernen (nur wenn kein existierendes Verzeichnis)

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ http://example.org/$1 [R=301,L]

Redirect ohne www

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

Exisiterende Files und Ordner stehen Auszen vor

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Nicht existierende Files stehen Auszen vor

RewriteCond %{REQUEST_URI} !.

Alle anderen Requests werden an den RequestHandler weitergeleitet

RewriteRule ^(.*)$ index.php [L,QSA]

ErrorDocument 401 /Error/Index/401
ErrorDocument 403 /Error/Index/403
ErrorDocument 404 /Error/Index/404

Fallen euch unter dieser Konfiguration signifikante Probleme auf, oder evtl. Sachen die man verbessern oder vereinfachen koennte?

Vielen Dank schon mal im Voraus.

Mit freundlichen Grueszen,
Guenter