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
pelajar
quelle
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.

LazyOne
quelle
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>
Simon Hayter
quelle
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