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?
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).
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]
<VirtualHost *:80>
ServerAlias example.com
RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
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.
<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!
Dies ähnelt vielen anderen Vorschlägen mit einigen Verbesserungen:
%{REQUEST_URI}
-Regeln.Der Pfadabschnitt, der nicht von vorherigen RewriteRule
s wie %{REQUEST_URI}
betroffen ist, ist.
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_Host}/$1 [R=301,L]
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.
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.
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.
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.
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 ...
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]
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)
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>
<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
Versuche dies:
RewriteEngine on
RewriteCond %{HTTP_Host} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
RewriteEngine On
RewriteCond %{HTTP_Host} ^yourdomain.com [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]
Überprüfen Sie diese perfekte Arbeit
Das ist ganz einfach!
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_Host}%{REQUEST_URI} [R=301,L]
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>
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.
Ich verwende den Code:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
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/