Leiten Sie Nicht-WWW zu WWW in .htaccess um

188

Ich habe dies in meiner .htaccess-Datei:

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

Aber wenn ich auf eine Datei in meinem Stammverzeichnis zugreife http://example.com/robots.txt, wird diese umgeleitet http://www.example.comrobots.txt/.

Wie kann ich das korrigieren, damit es korrekt umgeleitet wird http://www.example.com/robots.txt?

Paul Sanchez
quelle

Antworten:

388

Ändern Sie Ihre Konfiguration in diese (fügen Sie einen Schrägstrich hinzu):

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

Oder die unten beschriebene Lösung (vorgeschlagen von @absiddiqueLive ) funktioniert für jede Domain:

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

Wenn Sie http und https unterstützen und die Protokollauswahl beibehalten müssen, versuchen Sie Folgendes:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Wo Sie ersetzen loginmit checkout.phpoder was auch immer URL müssen Sie unterstützen HTTPS auf.

Ich würde jedoch behaupten, dass dies eine schlechte Idee ist. Für die Begründung lesen Sie bitte diese Antwort .

Randall Hunt
quelle
Diese Lösung funktioniert nicht, wenn einige Seiten (wie Anmelden oder Anmelden) das https-Protokoll verwenden.
Alexey Kosov
Ich habe den Beitrag leicht aktualisiert, um einige Informationen aufzunehmen. Es ist schwierig, das zu verwendende Protokoll generisch und korrekt auszuwählen.
Randall Hunt
2
Die erste Lösung leitet nicht genug um, die zweite scheint zu viel umzuleiten. Zum Beispiel blog.example.comwirdwww.blog.example.com
gman
Könnten Sie bitte auch hinzufügen, wie Sie die Weiterleitung während der Entwicklung auf localhost vermeiden können?
Bugs Bunny
Ich habe hier alles verfolgt, aber nichts funktioniert. Ich benutze ein Laravel-Setup. Hat jemand eine Idee, warum das bei mir nicht funktioniert? www.domain.com und domain.com werden beide ordnungsgemäß geladen, domain.com leitet jedoch nicht zu www.domain.com weiter. Könnte dies ein Problem mit meinem DNS sein?
Hallo Welt
92

Hier ist die richtige Lösung, die https und http unterstützt:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Alexey Kosov
quelle
7
Dies ist perfekt, es leitet auch Subdomains nicht so um, wwwwie es die anderen generischen Lösungen tun.
Fabian Schmengler
4
Dies ist die beste Lösung, funktioniert viel besser als die akzeptierte Antwort und kümmert sich ordnungsgemäß um HTTPS
Tamik Soziev
3
Funktioniert perfekt! Und in so wenigen Zeilen!
Zeckdude
7
Andrew
7
Wenn ich mich nicht irre, würde dies nicht für mehr als einen Punkt funktionieren. Beispiele:yoursite.co.uk
TrashyMcTrash
82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Für Https

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddiqueLive
quelle
7
Diese Lösung wird @ ranman's vorgezogen, da sie für alle Domänen funktioniert und somit menschliche Fehler minimiert, entweder wenn Sie Code für ein neues Projekt implementieren oder wenn Sie zusätzliche Domänen für ein vorhandenes Projekt implementieren.
Frankie
Ich bevorzuge diese Lösung, aber warum ^(.*)$statt (.*)?
Popnoodles
Diese Lösung ist besser, aber ich habe meine so bearbeitet, dass sie auch Ihre enthält.
Randall Hunt
1
Dies funktioniert für alle Domänen, es ist einfach und effektiv! Vielen Dank
Eirenaios
Sie können RewriteCond% {HTTPS} s ^ on (s) | folgen RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive
23

Das folgende Beispiel funktioniert sowohl mit SSL als auch mit Nicht-SSL und ist viel schneller, da Sie nur eine Regel zum Verwalten von http und https verwenden

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[Geprüft]

Dies wird umleiten

http

zu

https

zu

starkeen
quelle
1
Sehr nah an dem, was ich mir ausgedacht habe. Unterstützt auch mehr als einen Punkt im HTTP-Host, zum Beispiel "mysite.co.uk".
Adambean
2
Warum verwenden Sie aus Neugier hier nicht R = 301? Standardmäßig wird 302 (verschobene Temperatur) verwendet, wenn kein Code angegeben ist.
Marc
1
Funktioniert perfekt. Dies sollte die akzeptierte Antwort sein.
James Nisbet
8

Versuchen Sie dies, ich habe es auf vielen Websites verwendet, es funktioniert perfekt

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
quelle
4

Ich habe alle oben genannten Lösungen getestet, aber es funktioniert nicht für mich. Ich habe versucht, das http: // zu entfernen und werde nicht umleiten. Außerdem habe ich das www it redirect gut entfernt. Daher bin ich verwirrt, insbesondere, dass ich alle meine Websites unter https ausführe : //

Also habe ich einige Codes miteinander kombiniert und eine perfekte Lösung für http: // und https: // sowie www und non-www gefunden.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Hoffe das kann jemandem helfen :)

Mizo-Spiele
quelle
3

Diese Konfiguration funktionierte für mich in Bitnami WordPress mit konfiguriertem SSL:

Das Folgende wurde unter "RewriteEngine On" in der Datei /opt/bitnami/apps/wordpress/conf/httpd-app.conf hinzugefügt

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
quelle
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

Dadurch wird Ihre Domain umgeleitet, die nicht mit WWW gestartet wurde. Es wird nicht Ihre gesamte Subdomain umgeleitet.

Es ist nützlich.

Ashish Gondaliya
quelle
2

Ich glaube, dass die Top-Antwort Nicht-www erfolgreich zu www umleitet (z. B. mysite.com -> www.mysite.com ), berücksichtigt jedoch keine Platzhalter-Subdomänen, was zu Folgendem führt:

random.mysite.com -> www.random.mysite.com

Hier ist eine Lösung mit / ohne HTTPS

HTTP

RewriteEngine On

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* Hinweis: Ich habe https nicht getestet, da ich derzeit kein zu testendes Zertifikat habe. Wenn jedoch jemand überprüfen oder optimieren kann, was ich habe, wäre das fantastisch.

Hunter Frazier
quelle
Was macht der erste $ hier: '^ (. *) $'
Vaishal Patel
0

Wenn möglich, fügen Sie dies der Hauptkonfigurationsdatei von Apache hinzu. Es ist eine leichtere Lösung, die weniger Verarbeitung erfordert.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Das separate VirtualHostfür "example.com" erfasst diese Anforderungen und leitet sie dann dauerhaft an Ihre Hauptanforderung weiter VirtualHost. Es gibt also keine REGEX-Analyse bei jeder Anforderung, und Ihre Client-Browser speichern die Umleitung im Cache, sodass sie nie wieder (oder selten) die "falsche" URL anfordern, wodurch Sie beim Laden des Servers sparen.

Beachten Sie, dass der nachfolgende Schrägstrich eingeht Redirect permanent / http://www.example.com/. Ohne sie example.com/asdfwürde eine Umleitung von zu http://www.example.comasdfstatt umleiten http://www.example.com/asdf.

Buttle Butkus
quelle
0

Zwei Warnungen

Vermeiden Sie 301 und bevorzugen Sie moderne 303- oder 307-Antwortstatuscodes.

Vermeiden Sie 301

Überlegen Sie genau, ob Sie die angegebene permanente Weiterleitung wirklich benötigen. [R=301]Wenn Sie sie später ändern möchten, sehen die vorherigen Besucher der Seite weiterhin die Seite der ursprünglichen Weiterleitung.

Die permanenten Umleitungsinformationen werden häufig im Cache des Browsers gespeichert und sind im Allgemeinen schwer zu entfernen (erneutes Laden der Seite löst das Problem nicht). Ihre Website-Besucher bleiben in der vorherigen Weiterleitung "für immer" stecken.

Vermeiden Sie auch 302

Die neue Version des HTTP-Protokolls (v1.1) hat zwei neue Antwortstatuscodes hinzugefügt, die anstelle von 302 verwendet werden können.

  • 303 URL-Umleitung, aber Anforderung, den Anfragetyp in GET zu ändern.
  • 307 URL-Umleitung, fordert jedoch, den ursprünglich gesendeten Anforderungstyp beizubehalten.

Sie können den Code weiterhin verwenden 302(nicht permanente Umleitung), obwohl er als mehrdeutig angesehen wird. In jedem Fall implementieren 302die meisten Browser die gleiche 303Anweisung wie der neue Code.

ePi272314
quelle
In Bezug auf Ihre Warnung zu 301 gilt dies auch dann, wenn es sich um denselben Domainnamen handelt. Ich bin mir nicht sicher, wie dies in diesem Fall zutreffen soll. Alle URLs werden von http://example.com/testingnach umgeleitet http://www.example.com/testing. Könnte langfristig ein schlechter Ansatz sein? Danke,
Sara_
-1

Schreiben Sie in .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
quelle
1
Gleich wie andere Antworten
Ankit