Generische htaccess-Umleitung von www zu nicht-www

484

Ich möchte umleiten www.example.comzu example.com. Der folgende htaccess-Code macht dies möglich:

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

Aber gibt es eine Möglichkeit, dies generisch zu tun, ohne den Domainnamen fest zu codieren?

Tiefbrunnen
quelle
64
Es ist wichtig zu wissen, dass, wenn Sie kein WWW (oder eine andere Subdomain) verwenden, alle Cookies an jede Subdomain gesendet werden und Sie keine Subdomain ohne Cookies für die Bereitstellung statischer Inhalte haben können, wodurch sich die Anzahl verringert Datenmenge, die zwischen dem Browser und dem Server hin und her gesendet wird. Etwas, das Sie später möglicherweise bereuen werden: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Stellen Sie außerdem sicher, dass Sie den kanonischen Namen ohne das WWW auf Ihren Seiten festlegen, um eine mögliche Strafe für doppelten Inhalt zu vermeiden. Auch wenn Sie absolute URLs in Ihren Links haben, stellen Sie sicher, dass diese auch alle nicht www sind.
Jeremy Morgan
Auf meinem Kopf ist es besser, hält die explizite Umleitung, vor allem , wenn die Konfiguration für eine andere Domäne zu kopieren, das könnte verschiedenes Tuning erfordern (www Domain ist besser , in einigen Fällen) weboptimizer.ch/2014/01/redirection-www
Schneeflocke
Gibt es einen Grund, warum diese Lösung in allen Fällen außer der Root-URL funktioniert? Zum Beispiel piont domain.com nicht zu domain.com , während domain.com/page1 zu domain.com/page1 umleitet .
Jeff Solomon
Wenn Sie www zu Nicht-www umleiten möchten, während Sie das Protokoll (HTTP oder HTTPS) beibehalten,
lesen Sie die folgende

Antworten:

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

Wie Michael, außer dass dieser funktioniert: P.

Volomike
quelle
16
Wenn es nicht funktioniert, fehlt Ihnen wahrscheinlich der RewriteEngine OnVorläufer, damit es funktioniert.
Henry
8
@Ben, wie würde ich dies umgekehrt verwenden, um einer Nicht-WWW-Website WWW hinzuzufügen ?
Anarkhos
18
Es leitet weiter http://www.domain.com/zu http://domain.com//. Sie sollten hinzufügen , /um die RewruteRule. Das funktioniert bei mir RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov
13
Ich hatte das gleiche Problem wie Vladimir, weil es http://domain.com//mit den doppelten Schrägstrichen umgeleitet wurde . Also habe ich es getan RewriteRule ^(.*)$ http://%1$1 [R=301,L] und es scheint so weit zu funktionieren
bobfet1
5
Bitte verwenden Sie die folgende Lösung, anstatt die Engine neu zu schreiben. Sie ist viel schneller und elegant: stackoverflow.com/questions/1100343/…
Birla
111

Aber wenn wir dies für separate http und https tun müssen:

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Andron
quelle
2
www.example.com/ leitet zu example.com// weiter. Gibt es eine Möglichkeit, den zusätzlichen Schrägstrich zu entfernen?
Bobby S
Gute Frage. Ich denke, die schnelle Lösung wird darin bestehen, zusätzliche Regeln (dh nur für diesen Fall) vor diesen oben beschriebenen zu verwenden. ZB: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron
3
@ Bobby Ich habe die Lösung in diesem Artikel verwendet . Es leitet www und HTTP zu nicht-www HTTPS um und behandelt auch das Trailing /.
Totymedli
Sie würden nur dann einen zusätzlichen Schrägstrich erhalten (am Anfang des URL-Pfads), wenn Sie diese Anweisungen direkt in der Serverkonfiguration (oder im virtuellen Host) platziert hätten. In .htaccesssollten Sie keinen zusätzlichen Schrägstrich bekommen. (Nur um zu beachten, wenn Sie diese Umleitung in der Serverkonfiguration durchführen, sollten Sie wahrscheinlich zunächst nicht mod_rewrite verwenden ... Ein einfacher mod_alias Redirectim entsprechenden vhost-Container wäre effizienter und weniger fehleranfällig.)
MrWhite
72

Umleiten von nicht-www zu www (beide: http + https)

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Dmitriy
quelle
4
@nightcoder Dies liegt daran, dass meine Lösung für die inverse Umleitung (von Nicht-WWW zu WWW) im Gegensatz zu Androns
Dmitriy
2
Hinweis: Diese Lösung kann einige Probleme verursachen, wenn Sie Subdomainnamen für andere Zwecke verwenden möchten. Beispielsweise wird app.yourdomain.com auf www.app.yourdomain.com umgeleitet.
Marty ZHANG
1
Dies ist das genaue Gegenteil einer Antwort auf die Frage.
John
Ich musste hinzufügen RewriteEngine Onund RewriteBase /, aber sonst hat es gut funktioniert.
überdenken
45

Wenn Sie dies in der Datei httpd.conf tun möchten, können Sie dies ohne mod_rewrite tun (und anscheinend ist es besser für die Leistung).

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

Ich habe diese Antwort hier erhalten: /server/120488/redirect-url-within-apache-virtualhost/120507#120507

William Denniss
quelle
33

Hier sind die Regeln, um eine www-URL zu no-www umzuleiten:

#########################
# redirect www to no-www
#########################

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

Hier sind die Regeln, um eine No-www-URL zu www umzuleiten:

#########################
# redirect no-www to www
#########################

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

Beachten Sie, dass ich das NEFlag verwendet habe, um zu verhindern, dass Apache der Abfragezeichenfolge entgeht. Ohne dieses Flag ändert Apache die angeforderte URL http://www.example.com/?foo%20barinhttp://www.example.com/?foo%2250bar

Salman A.
quelle
1
können Sie Code schreiben, um http zu https zusammen mit umleiten www zu nicht-www
umzuleiten
Ändern Sie http: // in https: //, um es bei Änderungen in HTTPS zu erzwingen. Sie möchten auch eine reguläre http-> https-Umleitung für Datenverkehr hinzufügen, der von diesen Regeln nicht umgeleitet wird.
Diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

Das RewriteConderfasst alles in der HTTP_HOSTVariablen nach dem www.und speichert es in %1.

Der RewriteRuleerfasst die URL ohne den führenden /und speichert sie in $1.

Michael Cramer
quelle
1
sans leading "/"- In .htaccess(wie in der Frage angegeben) gibt es keine Führung /, daher stimmt das Muster nie überein und die Umleitung erfolgt nie. (In einem Server- oder Virtualhost- Kontext gibt es nur einen führenden Schrägstrich .) Wenn Sie danach mod_rewrite-Anweisungen haben, benötigen Sie das LFlag.
MrWhite
7

Versuche dies:

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

Wenn der Host mit www beginnt, kleben wir den gesamten Host an den Anfang der URL und entfernen dann das "www".

Greg
quelle
1
RoBorg, leider funktionieren Ihre Einstellungen nicht, wenn ich dies versuche: example.com/hello/world Ich lande hier: example.com/hello/world/world Ich musste auch einen Schrägstrich nach% {HTTP_POST} in der hinzufügen Erste RewriteRule
Deepwell
2
Ich verwende Apache / 2.2.9 (Unix). Es funktioniert für www.website, die zur Website weiterleitet. Für Folgendes gilt jedoch: website / test -> geht zu: websitetest Ich habe dies durch Hinzufügen eines weiteren / zweiten Fehlers behoben: website / test / n geht zu websitetest / n / n
deepwell
1
Gleiches Problem wie @deepwell mit diesem.
neemzy
Die Probleme, die frühere Leser haben, sind, weil diese Anweisungen für die Serverkonfiguration (oder vhost) bestimmt sind, nicht .htaccess. In einem Verzeichniskontext ( .htaccess) sollten Sie das erste ändern RewriteRule, um RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI]Folgendes zu lesen: (erfordert Apache 2.2.12+). Beachten Sie das Hinzufügen des Schrägstrichs und des DPIFlags (Pfadinformationen verwerfen), um zu verhindern, dass ein Teil des URL-Pfads scheinbar dupliziert wird (was tatsächlich "Pfadinfo" ist), wie in früheren Kommentaren angegeben. Es gibt jedoch einfachere Richtlinien - wie in den anderen Antworten beschrieben.
MrWhite
7

Vollständiger generischer WWW-Handler, http / https

Ich habe keine vollständige Antwort gesehen. Ich benutze dies, um die WWW-Aufnahme zu handhaben.

  1. Generisch. Benötigt keine Domain-Informationen.
  2. Erzwingt das WWW auf der primären Domain: www.domain.com
  3. Entfernt das WWW für Subdomains: sub.domain.com
  4. Erhält den HTTP / HTTPS-Status.
  5. Ermöglicht einzelne Cookies für Domain / Sub-Domains

Bitte lassen Sie mich wissen, wie das funktioniert oder ob ich eine Lücke hinterlassen habe.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Gregor Macgregor
quelle
In der ursprünglichen Frage wird darum gebeten, wwwauf Nicht- umzuleiten www. Sie erzwingen die Aufnahme von www.
Vadim
6

Ich finde, es kann eine Menge Fehlinformationen über htaccess-Weiterleitungen geben. Stellen Sie zunächst sicher, dass Ihre Site unter Unix mit Apache und nicht auf einem Windows-Host ausgeführt wird, wenn Sie erwarten, dass dieser Code funktioniert.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(Stellen Sie jedoch sicher, dass zwischen den einzelnen Textzeilen keine Zeilenabstände vorhanden sind. Ich habe einen zusätzlichen Abstand zwischen den Zeilen hinzugefügt, damit es in diesem Fenster in Ordnung ist.)

Dies ist ein Codeausschnitt, mit dem die WWW-Version Ihrer Website auf die http: // - Version umgeleitet werden kann. Es gibt auch andere ähnliche Codes, die verwendet werden können.

Htaccess-Weiterleitung
quelle
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Für Unterordner

pelajar
quelle
3

Für diejenigen, die auf die gesamte Site OHNE das Präfix 'www' zugreifen müssen .

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

Stellen Sie sicher, dass Sie dies der folgenden Datei hinzufügen

/site/location/.htaccess 
Rick
quelle
Dieses Beispiel ist nicht vollständig - Sie legen die protosslUmgebungsvariable nicht fest (dies ist keine Standard- / Servervariable). Dies ist immer leer und wird immer an weitergeleitet http. (Die Idee hinter der Einstellung protosslfrüher im Code ist, wenn Sie das Protokoll bei der Umleitung beibehalten möchten. In diesen Tagen sollten Sie jedoch wahrscheinlich die httpsganze Zeit umleiten .)
MrWhite
3

Verwenden von .htaccess zum Umleiten zu www oder nicht www:

Fügen Sie einfach die folgenden Codezeilen in Ihre Hauptdatei .htaccess ein. In beiden Fällen ändern Sie einfach domain.com in Ihren eigenen Hostnamen.

Weiterleiten an www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Weiterleiten an Nicht-WWW

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

Ändern Sie DOT in =>. !!!

Rohallah Hatami
quelle
2

Ich habe die obige Regel verwendet, um www zu no www weiterzuleiten, und es funktioniert gut für die Homepage, jedoch auf den internen Seiten, die sie an /index.php weiterleiten

Ich habe diese andere Regel in meiner .htaccess-Datei gefunden, die dies verursacht, bin mir aber nicht sicher, was ich dagegen tun soll. Anregungen wäre toll:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
Luke
quelle
Sie müssen Nicht-WWW-Umleitungsregeln vor den von Ihnen angegebenen Regeln platzieren.
Vladimir Jovanović
2

www bis nicht www mit https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rajith Ramachandran
quelle
2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Wenn Sie wwwbeide httpund entfernen möchten https, verwenden Sie Folgendes:

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

Dies leitet Non ssl weiter

zu

Und SSL

zu

Auf Apache können 2.4.*Sie dies mit einer Redirectwith- ifDirektive erreichen.

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
quelle
2

Verwenden Sie: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Oder .htaccess:

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

und die PHP-Methode:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
Antimalware-Programm
quelle
1

Nur so konnte ich es zum Laufen bringen ...

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

Wenn Sie www erzwingen. Versuchen Sie dann, in url oder ssl prototcol zu erzwingen, mögliche Variationen in der htaccess-Datei zu verwenden, z.

RewriteEngine On
RewriteBase /

### WWW erzwingen ###

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

## SSL erzwingen ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## IPs blockieren ###
Order Deny, Allow
Verweigern von 256.251.0.139
Verweigern von 199.127.0.259
Mystik
quelle
Apache kann einen anderen Port abhören, z. B. 81. Stattdessen RewriteCond %{SERVER_PORT} 80schlage ich vor, eine solche universellere Prüfung zu verwenden:RewriteCond %{HTTPS} off
Andron
1

Die ausgewählte Antwort und viele andere Lösungen hier haben den Teil der URL nach / gelöscht, so dass er im Grunde immer zur Hauptdomäne umgeleitet wurde, zumindest für mich. Also füge ich ein Arbeitsprobe hinzu, das den vollständigen Pfad nach dem Schrägstrich berücksichtigt.

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

Alternativer Ansatz, wenn die Anpassung von .htaccess keine ideale Option ist:

Ich habe einen einfachen Weiterleitungsserver für die öffentliche Verwendung erstellt. Fügen Sie einfach einen A- oder CNAME-Datensatz hinzu:

CNAME   r.simpleredirect.net
A       89.221.218.22

Weitere Informationen: https://simpleredirect.net

Bobík
quelle
0

Ich bin nicht sicher, warum du www entfernen willst. Aber die umgekehrte Version wäre:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

Und der Vorteil dieses Skripts ist: Wenn Sie so etwas wie test.whattimein.com oder eine andere (Umgebung zum Entwickeln / Testen) haben, wird U nicht in die ursprüngliche Umgebung umgeleitet.

lokal
quelle
2
Ob die WWW-Subdomain enthalten sein soll oder nicht, ist eine Frage der persönlichen Präferenz und kann vom Domainnamen und der Zielgruppe abhängen. Der oben angegebene generische Code für die Umleitung von www zu none-www behandelt auch Testumgebungen in Ordnung, da die Umleitung nur erfolgt, wenn "www". Subdomain ist angetroffen.
MrWhite
1
Diese Frage macht das Gegenteil von dem, was der Benutzer stellt, was nur den Beitrag verschmutzt.
Vadim
0

Dies wurde aktualisiert, um mit Apache 2.4 zu funktionieren:

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

Die einzige Änderung gegenüber Michael besteht darin, die zu entfernen [NC], die den Fehler "AH00665" erzeugt:

Die NoCase-Option für das Nicht-Regex-Muster '-f' wird nicht unterstützt und ignoriert

William Entriken
quelle
Die frühere Antwort musste nicht "aktualisiert werden, um mit Apache 2.4 zu funktionieren". Die "Warnung", die Sie zitieren (AH00665), bezieht sich auf eine andere Anweisung (z. B. wenn Sie so etwas hatten RewriteCond %{REQUEST_FILENAME} !-f [NC]). Das NCFlag macht in den obigen Ausführungen kaum einen Unterschied. Der Grund, warum das NCFlag hier verwendet werden sollte , besteht darin, den kleinen Teil des Bot-Verkehrs zu erfassen, der (fälschlicherweise) einen Hostnamen in Großbuchstaben sendet.
MrWhite
0

Wenn localhost hinzugefügt, ignorieren Sie die Umleitung (für Entwicklungszwecke in der lokalen Umgebung). Wenn nicht localhost AND (nicht https ODER www), leiten Sie zu https und non-www um.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Jeaf Gilbert
quelle
Bitte erarbeiten Sie Ihren Code, damit das OP versteht, wie dies die Frage beantwortet.
RyanNerd
-2

Hallo, Sie können folgende Regeln für Ihre htaccess-Datei verwenden:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
quelle
Die Frage ist nach einer "generischen" Lösung, die den Domainnamen nicht enthält. Ihre Lösung macht auch das genaue Gegenteil von dem, was in der Frage verlangt wird (nicht www zu www, anstatt www zu nicht www), ohne Erklärung.
MrWhite