Wie leite ich eine URL in eine Kleinbuchstaben-URL um?


7

Ich benutze:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On   
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule (.*) http://example.com/$1 [L,R=301]
</IfModule>

Aber ich möchte alle Großbuchstaben in Kleinbuchstaben umschreiben, z.

  • ALT: /myfolder-sample-URL.html
  • NEU: /myfolder-sample-url.html

Um eine solche Umleitung mit mod_rewrite und .htaccess zu implementieren, müssen Sie die RewriteMap- Direktive verwenden, die nicht in .htaccess platziert werden kann - nur im Kontext von Serverkonfiguration / VirtualHost. Haben Sie Zugriff auf die Serverkonfiguration? Kannst du es aendern? Wenn nein, können Sie es nur implementieren, wenn Sie die eigentliche Seite ausführen (mit PHP / ASP.NET usw.).
LazyOne

Vielen Dank für den Vorschlag. Ja, ich habe Zugriff auf RewriteMap. Also ... was soll ich jetzt tun?
Pelajar

Antworten:


9

Um eine solche Umleitung mit mod_rewrite und .htaccess zu implementieren, müssen Sie eine RewriteMapDirektive verwenden, die nicht in .htaccess platziert werden kann - nur im Kontext server config / VirtualHost. Wenn Sie einen solchen Zugang haben:

1. Platzieren Sie diese Zeile innerhalb des <VirtualHost>Blocks für Ihre Site:

RewriteMap lc int:tolower

2. Platzieren Sie dies in Ihrem .htaccess:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

Dadurch wird jede URL mit mindestens 1 Großbuchstaben (nur lateinische Buchstaben) im Pfadteil der URL (Abfragezeichenfolge wird ignoriert) auf dieselbe, jedoch in Kleinbuchstaben umgeleitet (301 Permanent Redirect) .

Zum Beispiel:

http://mydomain.com/myfolder-sample-URL.html
=> 
http://mydomain.com/myfolder-sample-url.html

http://mydomain.com/myfolder-sample-url.HTML
=> 
http://mydomain.com/myfolder-sample-url.html

wird aber nichts für diese URLs tun:

http://mydomain.com/myfolder-sample-url.html?say=MEOW
http://MYDOMAIN.com/myfolder-sample-url.html

Wenn Sie es nur auf HTML-Dateien beschränken möchten:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^.+\.html$ ${lc:%{REQUEST_URI}} [NC,R=301,L]

Wo zu platzieren: Ich würde es nach der Domain Name Redirect-Regel platzieren:

RewriteEngine On

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

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule . ${lc:%{REQUEST_URI}} [R=301,L]

# your other rules

Ich empfehle auch die Verwendung von rel = "kanonischen" Links:

<link rel="canonical" href="PROPER_URL_HERE" />

Wenn Sie keine Umleitung benötigen, sondern die Datei unabhängig von der Groß- und Kleinschreibung des Dateinamens bereitstellen können ( Dateinamen ohne Berücksichtigung der Groß- und Kleinschreibung), können Sie mod_spelling ( http://httpd.apache.org/docs/current/mod/mod_speling) verwenden .html ) und CheckCaseOnly OnDirektive.


1
"Wenn Sie keine Umleitung benötigen, ... können Sie mod_spelling verwenden" - mod_speling (ein L) gibt tatsächlich eine 301-Umleitung zum beabsichtigten Dokument aus.
MrWhite

2

Fügen Sie dies oben in Ihrem .htaccess hinzu

QUELLE: Zugriff auf Umleitung von Großbuchstaben in Kleinbuchstaben

RewriteEngine On
RewriteBase /

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Alternativ unterstützt Ihr Host möglicherweise mod_speling. In diesem Fall können Sie in der Serverkonfiguration, im virtuellen Host, im Verzeichnis oder in einer .htaccess-Datei Folgendes verwenden: Beispiel unten:

<IfModule mod_speling.c>
    CheckCaseOnly On
    CheckSpelling On
</IfModule>

3
Gibt es einen Grund, diese 26 separaten Umschreiberegeln lieber zu verwenden als die zweizeilige Umschreiberegelung, die lc:aus LazyOnes Antwort hervorgeht?
Stephen Ostermiller

1
Abhängig von der Situation erfordert die von mir aufgeführte nur htaccess, die kürzere Version erfordert jedoch aufgrund der anfänglichen RewriteMap lc int:tolowerAnforderung sowohl virtuellen Host als auch htaccess .
Simon Hayter

Der Grund, warum ich diese Antwort gepostet habe, war, dass ich eine sehr ähnliche Frage geschlossen habe, die nach einer Methode nur für htaccess gefragt hat.
Simon Hayter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.