it-swarm.com.de

apache-Umleitung von Nicht-WWW zu WWW

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

Meine Apache-Konfiguration sieht wie folgt aus:

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?

185
user121196

Die Verwendung der Umschreibungs-Engine ist eine ziemlich schwere Art, 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.com für Ihre echte Serverkonfiguration. Apache bewahrt automatisch alles nach dem /, wenn die Redirect-Direktive verwendet wird. Dies ist ein weit verbreitetes Missverständnis darüber, warum diese Methode nicht funktioniert (obwohl sie tatsächlich funktioniert).

472
Greg Hewgill

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]
74
burzumko
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
43
cherouvim

Um www von Ihrer URL-Website zu entfernen, verwenden Sie diesen Code in Ihrer .htaccess-Datei:

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

Um www in Ihrer Website zu erzwingen, verwenden Sie URL diesen Code für .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.com durch Ihre URL ersetzt werden muss. 

30
Sergio Martins
    <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 geschieht 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 kommt es zum zweiten virtuellen Host-Abschnitt. Hier wird alles andere als www.example.com an www.example.com weitergeleitet.

Die Reihenfolge hier ist wichtig. Wenn Sie zuerst die zweite Virtualhost-Direktive hinzufügen, führt dies zu einer Umleitungsschleife.

Diese Lösung leitet alle Anfragen an Ihre Domain an www.yourdomain.com weiter.

Prost!

21
Dishan Philips

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

  • Keine Notwendigkeit, die Domäne fest zu kodieren (funktioniert mit vhosts, die mehrere Domänen oder zwischen Umgebungen akzeptieren)
  • Behält das Schema (http/https) bei und ignoriert die Auswirkungen der vorherigen %{REQUEST_URI}-Regeln.
  • Der Pfadabschnitt, der nicht von vorherigen RewriteRules wie %{REQUEST_URI} betroffen ist, ist.

    RewriteCond %{HTTP_Host} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_Host}/$1 [R=301,L]
    
15
weotch
RewriteCond %{HTTP_Host} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Dies beginnt mit der Variable HTTP_Host, die nur den Domainnamen der eingehenden URL (example.com) enthält. Wenn der Domainname keinen www. enthält und genau mit Ihrem Domainnamen übereinstimmt, kommt die RewriteRule zum Einsatz. Das Muster ^(.*)$ stimmt mit allem in REQUEST_URI überein, der Ressource, die in der HTTP-Anforderung (foo/blah/index.html) angefordert wurde. Es speichert dies in einer Rückwärtsreferenz, die dann verwendet wird, um die URL mit dem neuen Domänennamen (der mit www beginnt) umzuschreiben.

[NC] steht für eine Musterüberprüfung ohne Berücksichtigung der Groß- und Kleinschreibung, [R=301] eine externe Weiterleitung mit Code 301 (Ressource wird permanent verschoben), und [L] stoppt alle weiteren Schreibvorgänge und leitet sofort um.

10
Curtis Tasker

Ich lief das ...

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

Ich brauche dies, um für über 25 Domains auf unserem neuen Server universell zu sein, daher befindet sich diese Direktive in meiner Datei virtual.conf in einem <Directory> -Tag. (dir ist Elternteil aller Dokroots)

Ich musste mich jedoch ein wenig mit der Umschreibungsregel auseinandersetzen, da der vollständige Docroot-Befehl bei dem Musterabgleich durchgeführt wurde, obwohl http://httpd.Apache.org/docs/2.2/mod/mod_rewrite html sagt darüber, dass es nur Sachen hinter dem Host und dem Port sind. 

5
Andrew Deal

Umleitungscode für nicht-www => www und umgekehrt www => nicht-www. Keine hartcodierten Domänen und Schemata in der .htaccess-Datei. Die Origin-Domäne und die http/https-Version bleiben also 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 in Apache 2.2, wo% {REQUEST_SCHEME} nicht verfügbar ist. Um die Kompatibilität mit Apache 2.2 zu gewährleisten, verwenden Sie 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 von letzter RewriteCond verfügbar ist ...

5
mikep

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 Sudomains funktionieren noch.
  • Keine Notwendigkeit, die Linien anzupassen. kopiere sie einfach an der richtigen Stelle.

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

(basierend auf der Standardeinstellung Drupal7 .htaccess, sollte aber in vielen Fällen funktionieren)

3
xaa

Wenn Sie Apache 2.4 verwenden, ohne das Apache-Modul zum erneuten Schreiben 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>
3
sys0dm1n
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Dadurch wird nicht nur der Domänenname, sondern auch das interne .__ umgeleitet. pages.like ...

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

2
Aneesh R S

Versuche dies:

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

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

Überprüfen Sie diese perfekte Arbeit

1
Tejinder singh

Das ist ganz einfach!

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

Verwenden Sie nicht immer Redirect permanent (oder warum dies Probleme verursachen kann)

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

Wenn ein Client eine Subdomain verwendet hat, die nicht als VirtualHost registriert ist, kann er diese Subdomain auch dann nicht erreichen, wenn sie später registriert wird.

redirect permanent sendet einen HTTP 301 Moved Permanently an den Client (Browser), und viele von ihnen speichern diese Antwort für immer (bis der Cache [manuell] gelöscht wird). Die Verwendung dieser Subdomain führt also automatisch zu WWW. ***, ohne den Server erneut anzufordern.

see Wie lange zwischenspeichern HTTP 301s?

Also benutze einfach Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Wann sollte mod_rewrite nicht verwendet werden

Apache.org - Kanonische Hostnamen

1
MA-Maddin

Das funktioniert für mich:

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 www-Unterdomäne auszuschließen, wenn alle Domänen an die www-Unterdomäne umgeleitet werden, um eine unendliche Weiterleitungsschleife in Apache zu vermeiden.

0

Ich verwende den Code:

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

Ich habe gerade ein Problem. Aber gelöst damit

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

Diese Regel leitet Nicht-WWW an WWW um.

Und diese Regel zur Weiterleitung von WWW zu Nicht-WWW

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

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