RewriteRule mit Leerzeichen in der Zieladresse

Auf einer Seite die ich betreue wurde ich vor kurzem vor die Aufgabe gestellt eine RewriteRule in der .htaccess zu definieren, die auf eine PDF zeigt, die ein Leerzeichen im Dateinamen enthält. Das war gar nicht so einfach rauszufinden und selbst im sehr guten Forum von modrewrite.de konnte ich keine geeignete Lösung finden.

In URLs werden Leerzeichen einfach mit der Zeichenkette %20 ersetzt, aber das alleine führt noch nicht zum Erfolg. Da das Prozentzeichen ein spezielles Zeichen in Rewrite Rules darstellt muss es mit einem Backslash escaped werden. Eine funktionierende Rewrite Rule mit einem Leerzeichen könnte also wie folgt aussehen:

RewriteEngine on
RewriteRule ^kurzer-dateiname.pdf$ dateiname\%20mit%20Leerzeichen\%20.pdf

Wer also den Dateinamen nicht ändern kann um Leerzeichen zu ersetzen (z.B. durch Unterstriche) kann mit dieser Regel trotzdem einen schöneren/kürzeren Dateinamen über die .htaccess anbieten.

Das war es auch schon. Heute gibt es mal nur einen kurzen Artikel, aber viel mehr gibt es auch nicht dazu zu sagen. Außer vielleicht, dass ihr niemals versuchen solltet ein Leerzeichen in der Zieladresse zu verwenden, da sonst die gesamte .htaccess ungültig wird und der Server einen 500 Fehler für jede Seite zurückliefert.

Ich hoffe der Tipp konnte euch weiterhelfe. Kommentare sind wie immer gern gesehen!

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

15 Kommentare » Schreibe einen Kommentar

  1. Ja, %20 für Leerzeichen funktioniert in der Regel sehr gut, auch bei einzelnen permanent redirects. Wo es aber immer Probleme gibt und was ich nie wirklich hingebekommen habe sind ä, ö, ü etc. wenn diese in der URL vorhanden sind. Hast Du ne Idee wie das gut funktionieren könnte?

  2. Hi,

    ich habe dabei ein kleines Problem. Ich habe folgenden Eintrag (auszugsweise) in der .htaccess:

    kel%2Bbreeze

    Als Ziel-URL bekomme ich jedoch:

    kel%252Bbreeze

    Wo kommt hier die 52 her?

    Gruß
    FloM

    • Hallo Flo,

      der Ferhler ist, dass du nicht %20 sondern nur %2 geschrieben hast. Ein URL-kodiertes Zeichen besteht aber immer aus mindestens zwei Zeichen. Da %2B als hexadezimaler Zahlenwert vetrachtet werden kann, wurde das wohl hier vom Browser gemacht. Das Zeichen 2B müsste aber das + Zeichen sein. Wie er dann auf 52 kommt weiß ich jetzt auch nicht. Aber füge einfach noch die 0 hinzu und es müsste dann klappen.

      Gruß
      Bernhard

    • Hey Bernhard,

      danke für den Tip. Ich habe nun folgendes getestet:
      hlc%20-m

      Das führt zu:
      hlc%2520-m

      Gruß
      FloM

    • OK, so wie es aussieht ist ein %2520 ein doppelt kodiertes Leerzeichen. Dabei wird das % Zeichen zu %25 (% hat im ASCII hexadezimal den Wert 25). Kann es sein, dass dein Eingabestring bereits ein %20 enthält und nicht ein echtes Leerzeichen?

      Ich habe heute das [NE] Flag gefunden, mit dem man zumindest ein weiteres kodieren verhindern kann. Versuche also mal das folgende:

      RewriteRule ^nice-name$ hlc%20-m [NE]
      

      Alternativ kannst du natürlich auch das doppelt kodierte Leerzeichen als Alternative mit in die RewriteRule aufnehmen, also in etwa so:

      RewriteRule ^nice-name$ hlc(%20|%2520)-m
      

      Damit solltest du auf jeden Fall die URL umleiten können. Am besten ist es aber natürlich immer, Leerzeichen in den URLs komplett zu vermeiden.

      Falls das noch immer nicht klappt, könntest du mal bitte die gesamte RewriteRule angeben und zusätzlich, welche Version von Apache du nutzt?

    • Hi,

      ja ich habe wie beschrieben %20 in der RewriteRule eingetragen. Wenn ich deine Erläuterung richtig deute:

      FALSCH: hlc%20-m
      RICHTIG: hlc -m

      Als Ausgabe bekomme ich dann hlc%20-m bzw. im Firefox wird ein Leerzeichen (hlc -m) daraus. Ist das normal/OK? Wird das in der Form korrekt zu Google Analytics übertragen?

      Gruß
      Flo

    • Ich glaube wir reden aneinander vorbei. Es sieht so aus, als verwendest du das einfach nur in einem Link und nicht in einer RewriteRule für den Apache Server. Denn ansonsten würde der Firefox garnichts machen, da er ja den Rewrite-Link garnicht kennt. Wenn du einfach nur einen Link mit einem Leerzeichen verwenden möchtest (also im href Attribut) eines Links, dann kannst du einfach %20 anstelle des Leerzeichens verwenden.

    • OK, also zum einen ist dein Rewrite sehr umständlich (wieso die beiden RewriteCond?) und zum anderen ist die Lösung recht einfach. Da du ein Leerzeichen im Ziel nutzt, kannst du einfach ein „+“ für das Leerzeichen verwenden. Da du einen Link für Google Analytics erzeugen willst, wird ein + Zeichen für das Leerzeichen verwendet. Das kodiert man in einer URL als %2B (hexadezimal für das ASCII Zeichen).

      Der Rewrite sollte also auf folgende Ziel-URL zeigen: http://www.test.eu/de/test?utm_source=djd&utm_medium=Print&utm_campaign=djd%2B-%2Btest%2Bkindersicher

      Nach meiner Meinung sollte folgende Rewrite ausreichen:
      RewriteRule ^/kindersicher$ http://www.test.eu/de/test?utm_source=djd&utm_medium=Print&utm_campaign=djd%2B-%2Btest%2Bkindersicher [L,R=301]

      Eventuell noch mit einem (.*) am Ende der Quelladresse.

    • Das werde ich bei Gelegenheit mal testen. Kann es sein, dass Umlaute auf dem iPhone nicht korrekt behandelt werden? Ich habe mehrere Regeln, in der ein „ö“ enthalten ist. Teilweise werden diese in Analytics korrekt erfasst und teilweise vor dem „ö“ abgeschnitten.

      Beispiel:

      RewriteRule ^(.*)$ http://www.test.eu/test?utm_source=Mein Schönes Zuhause&utm_medium=Print&utm_campaign=Mein Schönes Zuhause – Empire, breeze, Fieldstone [L,R=301]

      Dann steht bei Google Analytics nur „Mein Sch“. Die User, die ich das habe testen lassen, haben die Adresse beide mit dem iPhone geöffnet.

    • Hier ist wohl der / von kindersicher zu viel. Also einfach RewriteRule ^kindersicher ... versuchen, das sollte dann klappen.

    • Also genau wie vormals beschrieben, habe ich %20 für das Leerzeichen verwendet. Ich habe dazu auch mal einen Rewrite hier auf meinem Blog wie folgt definiert:


      RewriteRule ^testkauboys$ https://kau-boys.de/debug_request.php?utm_source=test&utm_medium=Print&utm_campaign=test%20-%20test [L,R=301]

      Bei Aufruf der URL: https://kau-boys.de/testkauboys wirst du also weitergeleitet und wie du sehen kannst wird der Request-Parameter in PHP korrekt dargestellt.

      Alternativ kannst du wie schon erwähnt das + Zeichen als Ersatz für das Leerzeichen verwenden, so wie es in URLs kodiert wird. Dann verwende folgenden Rewrite:


      RewriteRule ^testkauboys2$ https://kau-boys.de/debug_request.php?utm_source=test&utm_medium=Print&utm_campaign=test+-+test [L,R=301]

      Hier kannst du das Ergebnis testen: https://kau-boys.de/testkauboys2

      Aber mein Tipp: Benutze doch einfach in Kampagnen-Namen einfach keine Sonderzeichen, Leerzeichen und die Zeichen, die in URLs eine besondere Beudeutung haben (%, &, =, +). Damit hast du dann keine Probleme mehr mit den Rewrites.

      Für weitergehende Tipps zu Rewrites allgemein findest du hier immer eine passende Lösung: http://forum.modrewrite.de/

      Für Tipps zum Erstellen von Google Analytics Link gibt es dieses Tool: http://www.google.com/support/analytics/bin/answer.py?answer=55578

      Ich bin weder ein Experte für Rewrites noch für Google Analytics. Also sollten meine Tipps nicht funktionieren und die die Kampagnen nicht umbenennen möchtest, dann wende sich eher an die passenden Experten.

      Ach ja, und der Slash vorne kann weggelassen werden, ohne dass dadurch auch ein Link bla-testkauboys zu einer Weiterleitung führt. Denn RewriteRules verwenden Reguläre Ausdrücke und das Zeichen ^ bedeutet, dass die URL mit dem Suchmuster beginnen muss. Ein $ am Ende verhindern wiederum, dass ein Link wie testkauboys-bla zu einem Rewrite führt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert