Frage

Ich habe eine Website, die von nicht-www www zu umleiten scheint nicht.

Meine Apache-Konfiguration ist 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 bin ich fehlt?

War es hilfreich?

Lösung

den Rewrite-Engine ist ein ziemlich Schwergewicht 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 werden Sie einen anderen <VirtualHost> Abschnitt mit ServerName www.example.com für Ihren realen Server Aufbau. Apache erhält automatisch etwas nach dem / bei der Verwendung der Redirect Richtlinie , was ist ein verbreiteter Irrtum, warum diese Methode nicht funktionieren (wenn es tatsächlich der Fall ist).

Andere Tipps

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 verwenden Sie diesen Code in Ihrer .htaccess Datei zu entfernen:

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

Um www in Ihrer Website URL Gebrauch zu zwingen diesen Code auf .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 müssen mit Ihrer URL ersetzt werden.

    <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 ist, was mit dem Code geschieht oben. Die erste virtuelle Host-Block überprüft, ob die Anforderung www.example.com und läuft Ihre Website in diesem Verzeichnis.

widrigenfalls, es auf den zweiten virtuellen Host-Abschnitt kommt. Hier etwas anderes als www.example.com wird umgeleitet www.example.com.

Die Reihenfolge hier zählt. Wenn Sie die zweite Virtualhost Direktive zuerst hinzufügen, wird es eine Umleitung Schleife führen.

Diese Lösung wird jede Anfrage auf Ihre Domain umleiten, um www.yourdomain.com.

Cheers!

Dies ist ähnlich wie viele der anderen Vorschläge mit ein paar Erweiterungen:

  • Keine Notwendigkeit, die Domain zu codieren (funktioniert mit vhosts die mehrere Domänen oder zwischen Umgebungen akzeptieren)
  • Behält das Schema (http / https) und ignoriert die Auswirkungen früherer %{REQUEST_URI} Regeln.
  • Der Wegabschnitt nicht von früheren RewriteRules wie %{REQUEST_URI} betroffen 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]

Das beginnt mit der HTTP_HOST Variable, die nur den Domain-Namen Teil der eingehenden URL (example.com) enthält. Unter der Annahme, der Domainname keinen www. enthält und entspricht Ihren Domain-Namen genau, dann kommt die RewriteRule ins Spiel. Das Muster ^(.*)$ wird alles in der REQUEST_URI übereinstimmen, die die Ressource in der HTTP-Anforderung (foo/blah/index.html) angefordert wird. Er speichert diese in einem Rückverweis, die dann verwendet wird, um die URL mit dem neuen Domainnamen neu zu schreiben (eine, die mit www startet).

[NC] zeigt an Groß- und Kleinschreibung Musterabgleich, [R=301] eine externe Umleitung anzeigt Code 301 (Ressource dauerhaft verschoben) und [L] stoppt alle weiteren Neuschreiben und leitet sofort.

Ich lief diese ...

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

Ich brauche dies für 25+ Domains auf unseren neuen Server universell zu sein, so dass diese Richtlinie in meiner virtual.conf Datei in einem Tag. (Dir ist Eltern zu allen docroots)

Ich hatte zwar ein bisschen wie ein Hack auf der Rewrite-Regel zu tun, da die volle docroot auf dem Mustervergleich durchgesetzt wurde, trotz allem, was http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html sagt über sie nur Sachen nach dem Host und Port zu sein.

Redirection-Code für beide nicht-www => www und gegenüber www => Nicht-www. Keine Hardcoding-Domänen und Systeme in .htaccess-Datei. So Ursprungsdomäne und http / https-Version erhalten werden.

APACHE 2.4 und neuerer

NON-WWW => WWW:

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

WWW => NON-WWW:

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

Hinweis: funktioniert nicht auf Apache 2.2, wo% {REQUEST_SCHEME} nicht verfügbar ist. Für die Kompatibilität mit Apache 2.2 Verwendung Code unten oder ersetzen% {} REQUEST_SCHEME mit fester http / https.


APACHE 2.2 und neuerer

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 => NON-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, weil% N nur von den letzten RewriteCond verfügbar ist ...

Wenn Sie mit Apache 2.4, ohne dass das Umschreiben von Apache-Modul, damit Sie so etwas wie diese verwenden können:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

Redirect domain.tld auf www.

Die folgenden Zeilen können entweder in Apache-Richtlinien oder in .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 noch arbeiten.
  • Keine Notwendigkeit, die Linien einzustellen. einfach kopieren / sie an der richtigen Stelle einfügen.

Vergessen Sie nicht die Apache Änderungen zu übernehmen, wenn Sie die vhost ändern.

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

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Dies wird umleiten nicht nur den Domain-Namen, sondern auch die inneren  pages.like ...
 example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

Versuchen Sie diese:

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

Das ist ganz einfach!

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

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

Aktivieren Sie diese perfekte Arbeit

Allways nicht verwenden Redirect permanent (oder warum es Probleme verursachen kann)

Wenn es eine Chance, dass Sie Subdomains später hinzugefügt werden, nicht redirect permanent verwenden.

Weil, wenn ein Client eine Sub-Domain verwendet hat, die nicht registriert als VirtualHost war, kann er auch nicht einmal diese Sub-Domain erreichen, wenn es später registriert ist.

redirect permanent sendet eine HTTP 301 Moved Permanently an den Client (Browser) und viele von ihnen diese Antwort immer Cache (bis Cache gelöscht wird [manuell]). So dass Sub-Domain verwendet, wird immer auf www autoredirect. *** ohne erneut den Server anfordert.

finden Sie unter Wie lange zwischenzuspeichern Browser HTTP 301s?

So verwenden Sie einfach Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Wenn sie nicht verwenden mod_rewrite

Apache.org - Canonical Host-Namen

Ich habe nur noch ein gleiches Problem. Aber mit dieser gelöst

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

Diese Regel Umleitung nicht-www www.

Und diese Regel www zu Umleitung 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/

Dies funktioniert für mich:

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

Ich verwende das Vorgriff Muster (?!www.domain.com) die www Sub-Domain auszuschließen, wenn alle Domänen der www Sub-Domain, um Umleitung eine unendliche Schleife Umleitung in Apache zu vermeiden.

Der Code ich benutze, ist:

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

Wenn die obige Lösung von zwei <VirtualHost *:80> Blöcken mit unterschiedlichen ServerNames mit ...

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

... dann Sie muss NameVirtualHost On auch gesetzt .

Wenn Sie dies nicht tun, Apache nicht zulässt, dass sich die verschiedenen ServerNames verwenden, um die Blöcke zu unterscheiden, so dass Sie diese Fehlermeldung erhalten:

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

... und entweder keine Umleitung geschieht, oder Sie haben eine unendliche Umleitung Schleife, je nachdem, welche blockieren Sie die erste Stelle setzen.

hatte ich eine ähnliche Aufgabe auf einem WP auf mehreren Systemen, wo die Umleitung Regel generisch sein musste (für jede gegebene Domain ich zum Netzwerk hinzufügen würde). Ich löste die Zugabe zunächst eine Wildcard für die Domäne (geparkten Domain). Beachten Sie das . nach .com.

CNAME * domain.com.

Und dann habe ich die folgenden Zeilen in die .htaccess-Datei an der Wurzel meiner Multi-Site. Ich denke, es würde für jede Website arbeiten.

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

Dies wird hoffentlich helfen.

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

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

Ich finde es einfacher (und nützliche) Serveralias zu verwenden, wenn mehrere vhosts verwendet wird.

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

Das funktioniert auch mit https vhosts.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top