.htaccess - wie man "www" erzwingt. generisch?

102

Dies ändert sich domain.comzu www.domain.com:

# Force the "www."
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Wie ersetze ich den Teil "Domain", damit dies auf jeder Domain funktioniert ?

StackOverflowNewbie
quelle

Antworten:

249

Ich würde diese Regel verwenden:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Die erste Bedingung prüft, ob der Host- Wert nicht leer ist (im Fall von HTTP / 1.0). Der zweite prüft, ob der Host- Wert nicht mit beginnt www.. die dritten Überprüfungen für HTTPS ( %{HTTPS}entweder onoder off, so %{HTTPS}sist entweder onsoder offsund im Fall onsder sabgestimmt ist). Der Substitutionsteil von führt RewriteRuledann nur die Informationsteile zu einer vollständigen URL zusammen.

Gumbo
quelle
31
Diese Lösung funktioniert nur, wenn alle Subdomains an www.yourdomain.com weitergeleitet werden sollen. Wenn Sie nur www erzwingen möchten, sollten Sie die zweite Zeile wie RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
folgt
2
Ich bekomme keine meiner Subdomains nach der in der Frage angegebenen Regel an www.mydomain.com weitergeleitet ...
lol
3
sehr schlau! Ich finde es gut, dass Sie die HTTPS-Prüfung gezwungen haben, ein "S" in der Erfassungsgruppe zurückzugeben, das Sie in der folgenden Zeile verwendet haben. sehr elegant
code_monk
Scheint wie eine universelle Antwort, deckt HTTPs und normale Protokolle ab, funktioniert wie ein Zauber.
Clain Dsilva
1
Vielen Dank! Ich würde RewriteEngine Onals erste Zeile hinzufügen , um es zu vervollständigen, da dies zu einem 500-Server-Fehler führen könnte, wenn es so kopiert wird, wie es ist.
Ryan Casas
44

Dies wird es tun:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Martin Drapeau
quelle
5

Wenn Sie alle Nicht-WWW-Anforderungen an Ihre Site in die WWW-Version umleiten möchten, müssen Sie Ihrer .htaccess-Datei lediglich den folgenden Code hinzufügen:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
ClickForWebs
quelle
3

Dies funktioniert nicht mit Subdomains.

domain.com wird korrekt zu www.domain.com umgeleitet

aber

images.domain.com wird zu www.images.domain.com umgeleitet

Anstatt zu überprüfen, ob die Subdomain "nicht www" ist, überprüfen Sie, ob zwei Punkte vorhanden sind:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
John McCarthy
quelle
Ich mag diese Lösung. Wie auch immer, um dasselbe mit TLDs wie .co.uk zu erreichen?
TylersSN
1
@iUseMagentoNow erhöhen Sie einfach die Punkte, zum Beispiel: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Genau genommen ist Ihre TLD still .ukund Ihre Domain ist something.co.)
mirabilos
.co ist in diesem Fall eine Domain der zweiten Ebene und nicht Teil Ihrer Domain, da .uk eine TLD mit Ländercode ist. Um ehrlich zu sein, nachdem ich in der Hosting-Branche gearbeitet habe und die neuen Formate für Domain-Namen gesehen habe, kann ich die aktuellen TLD-Formate nicht für etwas anderes als offizielle Zwecke sehen. Regierungen, Organisationen usw. In naher Zukunft wird das persönliche Web aus DNS-Sicht ganz anders aussehen, wenn Sie fqdn wie fred.bloggs zu einem ähnlichen Preis wie die aktuellen Normen registrieren können.
Chris
1

Im Folgenden sollte jeder Anforderung, die keine hat, das Präfix "www" vorangestellt und die bearbeitete Anforderung an den neuen URI umgeleitet werden.

RewriteCond "%{HTTP_HOST}" "!^www\."         [NC]
RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "(.*)"         "http://www.%1$1" [R=301,L]
RoUS
quelle
1
RewriteEngine On

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Dies leitet example.comzum www.example.comAusschließen von Subdomains weiter.

Amit Verma
quelle
Für mich scheint dies zu sein, www.example.com an www.www.example.com zu senden haha
Albert Renshaw
@ Albert Vielleicht liegt das an deinem Browser-Cache. Leeren Sie Ihren Cache und versuchen Sie es erneut.
Amit Verma
Du hast Recht! Ich bin gerade inkognito (Chrom) gelaufen und es hat gut funktioniert, danke!
Albert Renshaw
1
Ich mag diese generische Regel sehr. Aber es funktioniert nicht für domain.co.uk, da es bereits zwei Punkte enthält. Wie könnte diese Regel geändert werden, damit sie auch für .co.uk funktioniert?
Sacha Vorbeck
1
Für .co.uk und andere Unterabschnitte funktioniert dies: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $, Aber leider gibt es einige gemischte typisierte tlds ( wiki.mozilla.org/TLD_List ) wie es, die domain.es sowie domain.com.es zulassen. Das Hinzufügen von | es zur Regex würde sowohl mit domain.es als auch mit www.domain.es übereinstimmen, was hier nicht erwünscht ist. Müssen einen Weg finden, um mit diesen gemischten typisierten Unter-cctlds umzugehen
Sacha Vorbeck
0

Dies ist eine ältere Frage, und es gibt viele verschiedene Möglichkeiten, dies zu tun. Die vollständigste Antwort, IMHO, finden Sie hier: https://gist.github.com/vielhuber/f2c6bdd1ed9024023fe4 . (Das Einfügen und Formatieren des Codes hier hat bei mir nicht funktioniert)

Rick Hellewell
quelle
-1

Das hat für mich wie Magie funktioniert

RewriteCond% {HTTP_HOST} ^ sitename.com [NC] RewriteRule ^ (. *) $ Https://www.sitename.com/ $ 1 [L, R = 301, NC]

SamYah
quelle