Apache-Weiterleitung von nicht www zu www

206

Ich habe eine Website, die nicht von Nicht-WWW zu WWW umzuleiten scheint.

Meine Apache-Konfiguration lautet wie folgt:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Was vermisse ich?

user121196
quelle
1
Für eine .htaccessbasierte Lösung schlage ich eine Antwort vor, die auf die diametrale Frage gestellt wurde: stackoverflow.com/a/5262044/367456
hakre
Dies ist gut, es fügt jedoch einen Schrägstrich zur URL hinzu, also verlieren Sie den Schrägstrich vor dem Dollar.
Wuxmedia
Mögliches Duplikat der generischen htaccess-Umleitung www zu non-www
Bobík

Antworten:

510

Die Verwendung der Rewrite-Engine ist ein ziemlich schwerer Weg, um dieses Problem zu lösen. Hier ist eine einfachere Lösung:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Und dann haben Sie einen weiteren <VirtualHost>Abschnitt mit ServerName www.example.comfür Ihre echte Serverkonfiguration. Apache behält nach der /Verwendung der RedirectDirektive automatisch alles bei , was ein weit verbreitetes Missverständnis darüber ist, warum diese Methode nicht funktioniert (obwohl dies tatsächlich der Fall ist).

Greg Hewgill
quelle
20
Wie machen Sie das für eine Site, die auch einen virtuellen SSL-Host hat?
Shabbyrobe
28
Bei Verwendung dieses Vorschlags wird die Fehlermeldung "Die Webseite auf example.com hat zu viele Weiterleitungen verursacht" angezeigt. Haben andere dieses Problem?
Jonathan Berger
4
@ BlackDivine: Es ist nichts Magisches daran, es in die andere Richtung zu tun. Einfach tauschen www.exampleund examplewo immer sie im Beispiel erscheinen.
Greg Hewgill
11
@ JonathanBerger Wenn Sie zu viele Weiterleitungen haben, haben Sie die Datei wahrscheinlich nicht gut konfiguriert. Stellen Sie sicher, dass Sie über 2 VirtualHosts verfügen: einen mit Nicht-WWW (siehe oben) und einen mit Servername www.example.com mit der tatsächlichen Konfiguration. Stellen Sie außerdem sicher, dass auch in der Konfiguration von www.example.com keine Weiterleitung erfolgt (sowohl mod_alias als auch mod_rewrite).
Savas Vedova
3
Für einen virtuellen Host-Server, z. B. example.com, habe ich, Redirect 301 / http://example2.com/extra/aber wenn er umleitet, fehlt der abschließende Schrägstrich, was bedeutet, dass example.com/blahzu example2.com/extrablah. Irgendwelche Ideen? (Apache 2.2.22)
Peter Howe
87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
burzumko
quelle
3
sehr kurze Antwort ... aber auf die Punkte ... nicht sicher, ob dies eine Auf- oder Ab-Abstimmung ist
Thecoshman
2
Oh, das ist ordentlich, dies kann in der Serverkonfiguration auf der obersten Ebene enthalten sein (und wenn ja) gilt dies für jeden virtuellen Host!
thenickdude
Hallo @burzumko, wie erreicht man das, was für alle ohne www gilt, aber dann sagen wir example.com/subdi1/ws/* mal ohne www durchgehen?
Black Sensei
1
Ich habe diese Lösung auch für virtuelle HTTPS-Hosts verwendet. Fügen Sie einfach ein szu http in der dritten Zeile hinzu.
Rodrigoap
46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
Cherouvim
quelle
Das hat bei mir nicht funktioniert; es verursachte eine unendliche Umleitungsschleife zu derselben Site
dmiller309
1
@ dmiller309: Haben Sie aufgenommen haben passieren www.in der ServerAlias?
Cherouvim
2
Du hast recht, ich habe versehentlich www. in den ServerAlias ​​mit dem *. Platzhalter. Weil ich die Reihenfolge der VirtualHost-Einträge durcheinander gebracht habe, die *. Wildcard hatte die Möglichkeit zu passen, wenn ich nicht dachte, dass es würde.
dmiller309
7
Dies ist die beste Antwort, da sie sauber ist, den Pfad beibehält (im Gegensatz zu Antwort 1) und Rewrite nicht verwendet.
schieferstapel
30

Verwenden Sie diesen Code in Ihrer Datei, um ihn wwwvon Ihrer URLWebsite zu entfernen .htaccess:

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

Verwenden Sie diesen Code, um wwwIhre Website zu erzwingenURL.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Wo YourSite.commuss mit Ihrem ersetzt werden URL.

kloddant
quelle
Beste Antwort hier, da es für Websites mit mehreren Domainnamen <3
Clement Herreman
2
Wofür ist der zweite Teil mit der .html?
Nathan H
6
Entfernen Sie den Schrägstrich vor $ 1, um nach der Umleitung keinen doppelten Schrägstrich (//) zu erhalten => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion
22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

Dies passiert mit dem obigen Code. Der erste virtuelle Hostblock prüft, ob die Anforderung www.example.com lautet, und führt Ihre Website in diesem Verzeichnis aus.

Andernfalls wird der zweite Abschnitt für den virtuellen Host aufgerufen. Hier wird alles andere als www.example.com zu www.example.com umgeleitet.

Die Reihenfolge hier ist wichtig. Wenn Sie zuerst die zweite virtualhost-Direktive hinzufügen, wird eine Umleitungsschleife ausgelöst.

Diese Lösung leitet jede Anfrage an Ihre Domain weiter, an www.IhreDomain.com.

Prost!

Dishan Philips
quelle
16

Dies ähnelt vielen anderen Vorschlägen mit einigen Verbesserungen:

  • Keine Notwendigkeit, die Domain fest zu codieren (funktioniert mit vhosts, die mehrere Domains akzeptieren oder zwischen Umgebungen)
  • Erhält das Schema (http / https) und ignoriert die Auswirkungen der vorherigen %{REQUEST_URI} Regeln.
  • Der Pfadabschnitt, der nicht von vorherigen RewriteRules wie betroffen %{REQUEST_URI}ist, ist.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
weotch
quelle
4
Fast perfekt. Es muss% {HTTP_HOST} $ 1 sein, nicht% {HTTP_HOST} / $ 1 (oder es wird den Schrägstrich verdoppeln)
Michael Wyraz
@ Michael Wyraz: Verdoppelt sich hier nicht der Schrägstrich?!
not2savvy
10
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Dies beginnt mit der HTTP_HOSTVariablen, die nur den Domainnamen-Teil der eingehenden URL ( example.com) enthält. Angenommen, der Domainname enthält kein www.und stimmt genau mit Ihrem Domainnamen überein, dann kommt die RewriteRule ins Spiel. Das Muster ^(.*)$stimmt mit allem in der REQUEST_URIRessource überein , die in der HTTP-Anforderung ( foo/blah/index.html) angefordert wurde . Es speichert dies in einer Rückreferenz, die dann verwendet wird, um die URL mit dem neuen Domainnamen (einer, die mit beginnt) neu zu schreibenwww ) .

[NC]Zeigt einen Musterabgleich an, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, [R=301]zeigt eine externe Umleitung unter Verwendung des Codes 301 an (Ressource wird permanent verschoben), [L]stoppt alle weiteren Umschreibungen und leitet sofort um.

Curtis Tasker
quelle
6

Umleitungscode für Nicht-www => www und gegenüber www => Nicht-www. Keine fest codierten Domänen und Schemata in der .htaccess-Datei. So bleiben die Ursprungsdomäne und die http / https-Version erhalten.

APACHE 2.4 UND NEUER

NON-WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NICHT-WWW:

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

Hinweis: Funktioniert nicht mit Apache 2.2, wenn% {REQUEST_SCHEME} nicht verfügbar ist. Verwenden Sie zur Kompatibilität mit Apache 2.2 den folgenden Code oder ersetzen Sie% {REQUEST_SCHEME} durch festes http / https.


APACHE 2.2 UND NEUER

NON-WWW => WWW:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... oder kürzere Version ...

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

WWW => NICHT-WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

... kürzere Version nicht möglich, da% N nur ab der letzten RewriteCond verfügbar ist ...

mikep
quelle
Apache 2.4 config hat das Problem behoben, danke für die saubere Antwort .. !!
KimchiMan
5

Ich habe das gemacht ...

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

Ich brauche dies, um für mehr als 25 Domains auf unserem neuen Server universell zu sein, daher befindet sich diese Anweisung in meiner Datei virtual.conf in einem <Directory> -Tag. (dir ist allen docroots übergeordnet)

Ich musste die Umschreiberegel allerdings ein wenig hacken, da die vollständige Docroot für die Musterübereinstimmung durchgeführt wurde, obwohl http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dies sagt darüber nur Sachen nach dem Host und Port.

Andrew Deal
quelle
5

Wenn Sie Apache 2.4 verwenden, ohne das Apache-Modul zum Umschreiben aktivieren zu müssen, können Sie Folgendes verwenden:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
sys0dm1n
quelle
1
Unterschätzte Antwort. Auf diese Weise können zusätzliche vhosts vermieden werden, was für automatisierte Let'sEncrypt-Skripte gut ist.
Paul
Wenn Sie ANSIBLE verwenden, können Sie seit ANSIBLE 2.0 jetzt problemlos einen Block in eine Datei in einer Aufgabe einfügen. Weitere Informationen finden Sie hier docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n
3

Leiten Sie domain.tld zu www um.

Die folgenden Zeilen können entweder in Apache-Anweisungen oder in der .htaccess-Datei hinzugefügt werden:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Andere Sudomänen arbeiten noch.
  • Die Linien müssen nicht angepasst werden. Kopieren Sie sie einfach an der richtigen Stelle.

Vergessen Sie nicht, die Apache-Änderungen anzuwenden, wenn Sie den vhost ändern.

(basierend auf dem Standard-Drupal7 .htaccess, sollte aber in vielen Fällen funktionieren)

xaa
quelle
3

Das ist einfach!

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
kk4You
quelle
2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Dadurch werden nicht nur der Domainname, sondern auch die inneren Seiten umgeleitet. Wie ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh

Aneesh RS
quelle
Danke dafür. Sehr hilfreich.
Anthony
2

Versuche dies:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
Mark Ursino
quelle
2

Nicht immer verwenden Redirect permanent (oder warum es in Zukunft Probleme verursachen kann)

Wenn die Möglichkeit besteht, dass Sie später Subdomains hinzufügen, verwenden Sie diese nicht redirect permanent .

Denn wenn ein Client eine Subdomain verwendet hat, als die nicht registriert wurde VirtualHost erreicht er diese Subdomain möglicherweise auch dann nicht, wenn sie später registriert wird.

redirect permanent sendet eine HTTP 301 Moved Permanently an den Client (Browser) und viele von ihnen zwischenspeichern diese Antwort für immer (bis der Cache [manuell] geleert wird). Wenn Sie diese Subdomain verwenden, wird immer automatisch zu www. *** weitergeleitet, ohne den Server erneut anzufordern.

Siehe Wie lange zwischenspeichern Browser HTTP 301s?

Also einfach benutzen Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - Wenn Sie mod_rewrite nicht verwenden

Apache.org - Kanonische Hostnamen

Martin Schneider
quelle
1

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

Überprüfen Sie diese perfekte Arbeit

Tejinder singh
quelle
0

Ich habe nur das gleiche Problem. Aber damit gelöst

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

Diese Regel leitet Nicht-WWW zu WWW um.

Und diese Regel zur Umleitung von www zu nicht-www

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

Siehe http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

Santo Doni Romadhoni
quelle
0

Das funktioniert bei mir:

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

Ich verwende das Look-Ahead-Muster (?!www.domain.com), um die wwwSubdomain auszuschließen, wenn alle Domains in die wwwSubdomain umgeleitet werden, um eine Endlosumleitungsschleife in Apache zu vermeiden.

Mauricio Sánchez
quelle
0

Der Code, den ich benutze, ist:

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

-Wenn Sie mehrere Domainnamen hosten (optional)

-Wenn alle diese Domain-Namen https verwenden (wie sie sollten)

-wenn Sie möchten, dass alle diese Domainnamen www dot domainName verwenden

Dadurch wird eine doppelte Umleitung vermieden (http: // non www zu http: // www und dann zu https: // www).

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

Und

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

Sie sollten den Umleitungscode 301 in den bequemsten ändern

YOGO
quelle
-1

Bei Verwendung der obigen Lösung von zwei <VirtualHost *:80>Blöcken mit unterschiedlichen ServerName...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... dann sind Sie müssen festlegen , NameVirtualHost Onwie gut .

Wenn Sie dies nicht tun, erlaubt sich Apache nicht, die verschiedenen ServerNames zur Unterscheidung der Blöcke zu verwenden, sodass folgende Fehlermeldung angezeigt wird:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... und entweder findet keine Umleitung statt, oder Sie haben eine Endlosumleitungsschleife, je nachdem, welchen Block Sie zuerst setzen.

Stuart Caie
quelle
-1

Ich hatte eine ähnliche Aufgabe auf einer WP Multisite, bei der die Umleitungsregel generisch sein musste (für jede bestimmte Domain, die ich dem Netzwerk hinzufügen würde). Ich habe zuerst einen Platzhalter zur Domain hinzugefügt (geparkte Domain). Beachten Sie das . nach .com.

CNAME * domain.com.

Und dann habe ich die folgenden Zeilen zur .htaccess-Datei im Stammverzeichnis meiner Multisite hinzugefügt. Ich denke, es würde für jede Site funktionieren.

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

Hoffentlich hilft das.

ps. Wenn Sie von nicht www zu www umleiten möchten, ändern Sie die letzte Zeile in

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Carlo Rizzante
quelle
-2

Ich fand es einfacher (und nützlicher), ServerAlias ​​zu verwenden, wenn mehrere vhosts verwendet werden.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Dies funktioniert auch mit https vhosts.

Fabian76
quelle
Ein weiteres Drive-by-Downvote. Möchtest du das erklären, oh mächtiger Gott von httpd, der sich nicht die Mühe machen konnte, die Ablehnung zu erklären?
Anthony
1
Dies macht es so, dass Sie mehrere Domains haben, die dieselbe Site hosten. Abhängig von Ihrer Situation und dem Betrieb Ihres zugrunde liegenden Webservers treten Probleme mit nicht übertragenen Cookies, verwirrten Personen und Suchmaschinenproblemen auf (bei denen es sich um zwei verschiedene Websites handelt).
Jeffrey Van Alstine