2017-09-30 2 views
2

Ich arbeite an einem Projekt, das .htaccess für die Umleitung www.example.com/Name auf eine Profilseite verwendet. Ich habe es funktioniert gut für einzelne Wortnamen. Das Problem ist, dass, wenn der Name "San Francisco" ist, ich einen 404 bekomme, egal was ich versuche. Unten ist die Linie in meinem .htaccess..htaccess Leerzeichen im Namen

RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L] 

Ich frage mich, ob es etwas gibt, das ich tun kann, wenn ich die URL www.example.com/San_Francisco oder so etwas geben, dass es funktionieren würde. Ich las einige andere Fragen, die mit einem ähnlichen Thema zu tun hatten, aber nie zu einer funktionierenden Lösung kam.

(scheint wie www.example.com/San%20Francisco wäre am besten, denn wenn ich einen Link, der natürlich ist, was die URL Raum füllt)

+0

Ein '+' könnte auch anstelle eines Platzes gehen und trotzdem am selben Ort ankommen. –

+1

@AuntJamaima Ein '+' (plus) im URL-Pfad Teil der URL ist ein Literal '+', kein Leerzeichen. Das '+' ist nur eine alternative Codierung für den Bereich im Abfragezeichenfolgeteil der URL. – MrWhite

Antwort

3
RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L] 

Ihr RewriteRuleMuster nicht enthalten einen Raum, so es wird niemals ein Leerzeichen in der angeforderten URL, z. wwww.example.com/San%20Francisco (ist ein URL-codiertes Leerzeichen).

anzumerken, dass, obwohl der Raum URL codierte (% -encoded) in der Anforderung (um gültige Anforderung zu machen), die RewriteRuleMuster Spiele gegen das% -decoded URL-Pfad, dh. ein buchstäblicher Raum. Ein Literalraum muss in der Regex mit Backslash versehen sein (weil Leerzeichen Begrenzer in Apache-Konfigurationsdateien sind). Zum Beispiel:

RewriteRule ^([A-Za-z0-9\ ]+)$ viewProfile.php?Name=$1 [L] 

Alternativ können Sie auch die Kurz Hand Zeichenklasse \s für jede white-space Zeichen. Einige würden betrachten diese leichter zu lesen (da Sie nicht wirklich „sehen“ können Leerzeichen):

RewriteRule ^([A-Za-z0-9\s]+)$ viewProfile.php?Name=$1 [L] 

Oder Sie können nur einen nicht entkommen Raum nutzen und das gesamte Muster in doppelten Anführungszeichen umgeben:

RewriteRule "^([A-Za-z0-9 ]+)$" viewProfile.php?Name=$1 [L] 

Beachten Sie, dass die obigen Muster Leerzeichen am Anfang und Ende des URL-Pfads (Profilname) zulassen. Diese werden offensichtlich am besten vermieden, wenn der Profilname an erster Stelle erstellt wird.

Unnötig zu sagen, Leerzeichen sind problematisch in URLs und am besten von Anfang an vermieden. Im Falle eines "Profilnamens" würden Sie idealerweise eine separate "URL-Version" des Profilnamens erstellen, der nur in der URL verwendet wird, z. , All Klein Räume Bindestriche konvertieren: /san-francisco


Um Bindestriche (-) in dem Muster enthält, müssen diese am Anfang oder am Ende der Zeichenklasse enthalten sein (da Bindestriche sonst besondere Bedeutung in einer Zeichenklasse tragen).Zum Beispiel:

RewriteRule ^([A-Za-z0-9\s-]+)$ viewProfile.php?Name=$1 [L] 

Damit Unterstrichen (_) als auch in dem Profilname (URL-Pfad), dann fügen Sie einfach die _ überall in der Zeichenklasse:

RewriteRule ^([A-Za-z0-9_\s-]+)$ viewProfile.php?Name=$1 [L] 

Welche ist das gleiche wie:

RewriteRule ^([\w\s-]+)$ viewProfile.php?Name=$1 [L] 

die Kurz Hand Zeichenklasse Mit \w, um irgendein Wortzeichen darzustellen, dh. [a-zA-Z0-9_].

+0

Und mit '_' für' San_Francisco' ... '[A-Za-z0-9 \ s_] oder \ w' – Croises

+0

@Croises Ich dachte, das war nur eine vorgeschlagene Alternative zu einem _space, um vielleicht" konvertieren " _' _space_? Ich habe meine Antwort aktualisiert, um '_' (Unterstrich) zuzulassen. Das "Umwandeln" von _ in _space_ auf der Ebene ".htaccess" scheint unnötig zu sein. – MrWhite

+0

Ja, es ist in der Tat eine Möglichkeit. Und wie du werde ich '-' verwenden. Es kann auch im Test hinzugefügt werden. – Croises

Verwandte Themen