2009-08-22 6 views
1

Ich habe Seite, die von htaccess umgeleitet wird. jetzt kann ich die deutschen Zeichen als paramshtaccess Zeichencodierung Problem

wie

passieren site.com/maörx/idasd

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^([a-zA-Z0-9äÄöÖüÜéß\-]*)/?$ page.php?var=$1 [L] 

es wird in den lokalen Host zu arbeiten. aber nicht auf dem Server .... Server ich bin immer die gleiche alte Problem (Fehler 404: Objekt wurde nicht gefunden!)

ist der obige Code für den Server korrekt ist ??

Antwort

3

Es hängt von beiden Zeichenkodierungen ab (die in der .htaccess-Datei verwendeten und die für die angeforderte URI verwendet), wenn Ihre Regel funktioniert. Wenn beide gleich sind, sollte es funktionieren.

Die meisten Benutzeragenten verwenden heutzutage entweder ISO 8859-1 oder UTF-8, wenn sie die URL für eine Anforderung über HTTP codieren. Aber UTF-8 wird die ISO 8859-1 früher oder später ersetzen.

Und als bobince in den Kommentaren bemerkt, Apache verwendet intern die Einzelbyte-Codierung ASCII bei der Interpretation von .htaccess-Dateien. Sie könnten also Probleme bekommen, wenn Sie eine Mehrbyte-Codierung wie UTF-8 verwenden. Aber die folgende ist unabhänging Codierung:

# for ISO 8859-1 
RewriteRule ^([a-zA-Z0-9\xC4\xD6\xDC\xDF\xE4\xE9\xF6\xFC-]*)/?$ page.php?var=$1 [L] 
# for UTF-8 
RewriteRule ^(([a-zA-Z0-9-]|\xC3\x84|\xC3\x96|\xC3\x9C|\xC3\x9F|\xC3\xA4|\xC3\xA9|\xC3\xB6|\xC3\xBC)*)/?$ page.php?var=$1 [L] 

Aber eine solche Konstruktion zu vermeiden, könnten Sie einfach den Schrägstrich und Punkt ausschließen und den Wert bestätigen später mit PHP:

RewriteRule ^([^/.]*)/?$ page.php?var=$1 [L] 
+0

warum dann seine nur in Server geschieht. .. ich meine lokale Maschine es funktioniert .... :( – coderex

+0

Vielleicht verwenden Sie verschiedene Codierungen, entweder für die Datei oder die URI. – Gumbo

+1

+1, behandelt Apache mit Bytes, so dass die ursprünglichen Regeln nur funktionieren würden ISO-8859-1-Einreichungen, die selten sind, da URLs heute de facto UTF-8 sind, vermeiden das Problem auf dieser Ebene, indem sie alle zulassen alter Charakter durch; Wenn Sie im PHP-Skript eine Zeichenprüfung durchführen müssen, ist es nicht sinnvoll, eine solche Logik in der Webserverschicht als Neuschreiben zu verwenden. – bobince

0

Es sei denn, es etwas Besonderes, genau dieser Umlaute ist, sollten Sie POSIX-Zeichenklassen in regulären Ausdrücken wie verwenden [: alpha:], [: alphanum:], [: upper:] und [: lower: ].

Siehe z.B. POSIX character classes im Wikipedia-Artikel über reguläre Ausdrücke.