Ogólny htaccess przekierowuje www na inne niż www

484

Chciałbym przekierować www.example.comna example.com. Powoduje to następujący kod htaccess:

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

Ale czy istnieje sposób na zrobienie tego w ogólny sposób bez twardego kodowania nazwy domeny?

głęboka studnia
źródło
64
Ważne jest, aby pamiętać, że jeśli nie korzystasz ze strony internetowej (lub innej subdomeny), wszystkie pliki cookie zostaną przesłane do każdej subdomeny, a subdomeny bez plików cookie nie będą mogły służyć do wyświetlania treści statycznych, zmniejszając w ten sposób ilość danych przesyłanych tam iz powrotem między przeglądarką a serwerem. Coś, czego możesz później żałować: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Kolejna rzecz do rozważenia, upewnij się, że ustawiasz kanoniczną nazwę bez www na swoich stronach, aby uniknąć możliwej kary za powielanie treści. Również jeśli masz w swoich linkach bezwzględne adresy URL, upewnij się, że nie są to również www.
Jeremy Morgan,
Moim zdaniem lepiej zachować wyraźne przekierowanie, zwłaszcza podczas kopiowania konfiguracji dla innej domeny, która może wymagać innego strojenia (domena www jest lepsza w niektórych przypadkach) weboptimizer.ch/2014/01/redirection-www
płatek śniegu
Czy jest jakiś powód, dla którego to rozwiązanie działałoby we wszystkich przypadkach oprócz adresu URL root? Na przykład domena.com nie prowadzi do domeny.com , podczas gdy domena.com/strona1 przekierowuje na domenę.com/strona1 .
Jeff Solomon
Jeśli chcesz przekierować www do nie-www utrzymując protokół (HTTP lub HTTPS), a następnie zobaczyć ten powiązane pytanie: Przekierowanie www dla non-www zachowując protokołu HTTP lub HTTPS
MrWhite

Odpowiedzi:

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

Tak samo jak Michael, z wyjątkiem tego, że działa: P

Volomike
źródło
16
Jeśli to nie działa, prawdopodobnie brakuje Ci RewriteEngine Onprekursora, aby mógł działać.
hendry
8
@Ben, jak miałbym użyć tego w odwrotnej kolejności, aby dodać www do strony innej niż www?
anarkhos
18
Przekierowuje http://www.domain.com/do http://domain.com//. Powinieneś dodać /do RewruteRule. To działa dla mnie RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov
13
Miałem ten sam problem co Vladimir, ponieważ przekierowywał do http://domain.com//podwójnych ukośników. Tak zrobiłem RewriteRule ^(.*)$ http://%1$1 [R=301,L] i wydaje się, że do tej pory
działało
5
Skorzystaj z następującego rozwiązania zamiast przepisywania silnika, jest on znacznie szybszy, a jednocześnie elegancki: stackoverflow.com/questions/1100343/...
Birla
111

Ale jeśli musimy to zrobić dla osobnych http i https:

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
źródło
2
www.example.com/ przekierowuje do example.com// Jakikolwiek sposób na usunięcie dodatkowego ukośnika?
Bobby S
Dobre pytanie. Myślę, że szybkim rozwiązaniem będzie użycie dodatkowych reguł (tj. Tylko w tym przypadku) przed tymi opisanymi powyżej. Np .: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron,
3
@BobbyS Użyłem rozwiązania z tego artykułu . Przekierowuje www i HTTP na HTTPS inne niż www, a także obsługuje końcowe /.
totymedli
Otrzymasz tylko dodatkowy ukośnik (na początku ścieżki URL), jeśli umieścisz te dyrektywy bezpośrednio w konfiguracji serwera (lub virtualhost). W .htaccessnie powinieneś otrzymywać dodatkowego slash. (Należy zauważyć, że jeśli wykonujesz to przekierowanie w konfiguracji serwera, prawdopodobnie nie powinieneś używać mod_rewrite na początek ... proste mod_alias Redirectw odpowiednim kontenerze vhost byłyby bardziej wydajne i mniej podatne na błędy.)
MrWhite
72

Przekieruj inne niż www na www (zarówno: 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
źródło
4
@nightcoder To dlatego, że moje rozwiązanie dla odwrotnego przekierowania (z non-www na www) w przeciwieństwie do Androna
Dmitriy
2
Uwaga: to rozwiązanie może powodować pewne problemy, jeśli zamierzasz używać nazw poddomen do innych celów. Na przykład app.twojadomena.com zostanie przekierowana na www.app.twojadomena.com.
Marty ZHANG
1
Jest to dokładne przeciwieństwo odpowiedzi na pytanie.
Jan
Musiałem dodać RewriteEngine Oni RewriteBase /, ale poza tym działało dobrze.
przemyśleli
45

Jeśli chcesz to zrobić w pliku httpd.conf, możesz to zrobić bez mod_rewrite (i najwyraźniej jest to lepsze dla wydajności).

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

Mam tę odpowiedź tutaj: /server/120488/redirect-url-within-apache-virtualhost/120507#120507

William Denniss
źródło
33

Oto zasady przekierowywania adresu URL www na no-www:

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

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

Oto zasady przekierowywania adresu URL bez www na www:

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

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

Zauważ, że użyłem NEflagi, aby zapobiec ucieczce Apache'a z ciągu zapytania. Bez tej flagi apache zmieni żądany adres URL http://www.example.com/?foo%20barnahttp://www.example.com/?foo%2250bar

Salman A.
źródło
1
czy możesz napisać kod przekierowujący http na https wraz z przekierowaniem www na non-www
HYDER ALI 14.04.19
Zmień http: // na https: //, aby wymusić zmianę na HTTPS. Będziesz także chciał dodać zwykłe przekierowanie http-> https dla ruchu, który nie jest przekierowywany przez te reguły.
diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

RewriteCondWszystko wychwytuje w HTTP_HOSTzmiennej powww. i zapisuje go w %1.

W RewriteRuleprzechwytuje URL bez początkowego /i zapisuje je $1.

Michael Cramer
źródło
1
sans leading "/"- W .htaccess(jak podano w pytaniu) nie ma wiodącego /, więc wzorzec nigdy nie pasuje, a przekierowanie nigdy się nie dzieje. (W kontekście serwera lub wirtualnego hosta występuje tylko wiodący ukośnik .) Ponadto, jeśli masz później jakieś dyrektywy mod_rewrite, będziesz potrzebował Lflagi.
MrWhite
7

Spróbuj tego:

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

Jeśli host zaczyna się od www, umieszczamy cały host na początku adresu URL, a następnie usuwamy „www”.

Greg
źródło
1
RoBorg, niestety twoje ustawienia nie działają, jeśli spróbuję tego: example.com/hello/world skończę tutaj: example.com/hello/world/world Musiałem także dodać ukośnik po% {HTTP_POST} w Pierwsza RewriteRule
głęboki
2
Używam Apache / 2.2.9 (Unix). Działa dla strony internetowej, która przekierowuje na stronę internetową Ale dla następujących: strona / test -> idzie do: websitetest Naprawiłem to, dodając kolejny / Drugi błąd: strona / test / n przechodzi do websitetest / n / n
deepwell
1
Ten sam problem jak w @deepwell w tym przypadku.
neemzy
Problemy, które mają wcześniejsi czytelnicy, są spowodowane tym, że te dyrektywy są przeznaczone dla konfiguracji serwera (lub vhosta), a nie .htaccess. W kontekście katalogu ( .htaccess) powinieneś zmienić pierwszy RewriteRulena: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](wymaga Apache 2.2.12+). Zwróć uwagę na dodanie ukośnika i DPIflagi (Odrzuć informacje o ścieżce) - aby zapobiec pozornemu powieleniu części ścieżki URL (która w rzeczywistości jest „informacją o ścieżce”), jak stwierdzono we wcześniejszych komentarzach. Istnieją jednak prostsze dyrektywy - jak opisano w innych odpowiedziach.
MrWhite 20.01.2019
7

Kompletna ogólna obsługa WWW, http / https

Nie widziałem pełnej odpowiedzi. Używam tego do obsługi włączenia WWW.

  1. Rodzajowy. Nie wymaga informacji o domenie.
  2. Wymusza WWW w domenie podstawowej: www.domain.com
  3. Usuwa WWW z subdomen: sub.domain.com
  4. Zachowuje status HTTP / HTTPS.
  5. Umożliwia indywidualne pliki cookie dla domeny / subdomen

Daj mi znać, jak to działa lub jeśli zostawiłem lukę.

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
źródło
Pierwotne pytanie dotyczy przekierowania wwwna non- www. Wymuszasz włączenie www.
Vadim,
6

Uważam, że istnieje wiele dezinformacji na temat przekierowań htaccess. Po pierwsze, upewnij się, że witryna działa w systemie Unix przy użyciu Apache, a nie na hoście Windows, jeśli spodziewasz się, że ten kod będzie działał.

RewriteEngine On

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

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

(Upewnij się jednak, że nie ma odstępów między wierszami tekstu; dodałem dodatkowe odstępy między wierszami, aby było dobrze w tym oknie).

Jest to jeden fragment kodu, którego można użyć do przekierowania wersji www witryny na wersję http: //. Istnieją również inne podobne kody, których można użyć.

Przekierowanie Htaccess
źródło
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Dla podfolderu

pelajar
źródło
3

Dla tych, którzy muszą mieć dostęp do całej witryny BEZ prefiksu „www”.

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

Upewnij się, że dodajesz to do następującego pliku

/site/location/.htaccess 
Stóg
źródło
Ten przykład nie jest kompletny - nie ustawiasz protosslzmiennej środowiskowej (nie jest to zmienna standardowa / serwerowa). To zawsze będzie puste, więc zawsze przekierujemy do http. (Idea protosslwcześniejszego ustawienia kodu dotyczy sytuacji, gdy chcesz zachować protokół podczas przekierowywania. Jednak w dzisiejszych czasach prawdopodobnie powinieneś https
ciągle
3

Używając .htaccess do przekierowania na www lub nie www:

Po prostu umieść następujące linie kodu w głównym głównym pliku .htaccess. W obu przypadkach wystarczy zmienić domain.com na własną nazwę hosta.

Przekieruj na www

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

Przekieruj na stronę inną niż www

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

zmień DOT na =>. !!!

Rohallah Hatami
źródło
2

Użyłem powyższej reguły do ​​fwd www do braku www i działa dobrze dla strony głównej, jednak na wewnętrznych stronach są one przesyłane do /index.php

Znalazłem tę inną regułę w moim pliku .htaccess, który ją powoduje, ale nie jestem pewien, co z tym zrobić. Wszelkie sugestie byłyby świetne:

############################################
## 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]
Łukasz
źródło
Musisz umieścić reguły przekierowania inne niż www przed tymi, które zacytowałeś.
Vladimir Jovanović
2

www na non www z 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
źródło
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]

Jeśli chcesz usunąć wwwoba httpi https, użyj następujących poleceń:

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

To przekierowuje Non ssl

do

I SSL

do

na Apache 2.4.*możesz to zrobić za Redirectpomocą ifdyrektywy with ,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
źródło
2

użyj: 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";

Lub .htaccess:

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

i metoda PHP:

$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);
        }
    }
});
program antimalware
źródło
1

Jedyny sposób, w jaki udało mi się go uruchomić ...

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
siarczany
źródło
1

Jeśli wymuszasz www. w url lub wymuszanie prototcol ssl, a następnie spróbuj użyć możliwych odmian pliku htaccess, takich jak:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Force SSL ###

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

## Blokuj adresy IP ###
Zamów Odmów, Zezwól
Odmów z 256.251.0.139
Odmawiaj od 199.127.0.259
mistyk
źródło
Apache może nasłuchiwać innego portu, np. 81. Więc zamiast RewriteCond %{SERVER_PORT} 80sugerować użycie bardziej uniwersalnego sprawdzania:RewriteCond %{HTTPS} off
Andron
1

Wybrana odpowiedź i wiele innych rozwiązań tutaj upuściło część adresu URL po /, więc w zasadzie zawsze przekierowywałem do domeny głównej, przynajmniej dla mnie .. Więc dodam działającą próbkę uwzględniającą pełną ścieżkę po ukośniku ..

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

Alternatywne podejście, jeśli personalizacja .htaccess nie jest idealną opcją:

Stworzyłem prosty serwer przekierowań do użytku publicznego. Wystarczy dodać rekord A lub CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Więcej informacji: https://simpleredirect.net

Bobík
źródło
0

Nie jestem pewien, dlaczego chcesz usunąć www. Ale wersja odwrócona to:

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

Zaletą tego skryptu jest: jeśli masz coś takiego jak test.whattimein.com lub jakikolwiek inny (środowisko do programowania / testowania), nie przekieruje U do pierwotnego środowiska.

lokalny
źródło
2
To, czy subdomena www powinna zostać uwzględniona, czy nie, jest tak naprawdę kwestią osobistych preferencji i może zależeć od nazwy domeny i odbiorców docelowych. Powyższy ogólny kod przekierowujący www na none-www obsługuje również środowiska testowe OK, ponieważ przekierowanie występuje tylko wtedy, gdy „www”. napotkano subdomenę.
MrWhite
1
To pytanie jest przeciwieństwem pytania zadawanego przez użytkownika, które tylko zanieczyszcza post.
Vadim,
0

Zostało to zaktualizowane do pracy w Apache 2.4:

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

Jedyną zmianą w stosunku do Michaela jest usunięcie [NC], co powoduje błąd „AH00665”:

Opcja NoCase dla wzorca nieregexowego „-f” nie jest obsługiwana i zostanie zignorowana

William Entriken
źródło
Wcześniejsza odpowiedź nie wymagała „aktualizacji do pracy na Apache 2.4”. Przytoczone przez ciebie „ostrzeżenie” (AH00665) dotyczy innej dyrektywy (np. Jeśli coś takiego miałeś RewriteCond %{REQUEST_FILENAME} !-f [NC]). NCFlaga ma większego znaczenia w powyższym jednak z powodu NCflagi powinny być stosowane Oto złapać niewielką część ruchu bot który (niesłusznie) wysyła wielką hosta.
MrWhite
0

Dodane, jeśli localhost, zignoruj ​​przekierowanie (dla celów programistycznych w środowisku lokalnym). Jeśli nie localhost AND (nie https LUB to www), przekieruj na https i nie www.

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
źródło
Opracuj swój kod, aby PO zrozumiał, w jaki sposób odpowiada na pytanie.
RyanNerd
-2

Cześć, możesz użyć następujących reguł w swoim pliku htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
źródło
Pytanie dotyczy „ogólnego” rozwiązania, które nie zawiera nazwy domeny. Twoje rozwiązanie działa zupełnie odwrotnie niż w pytaniu (nie www do www, zamiast www do non-www) bez wyjaśnienia.
MrWhite