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?


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


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]

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]

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


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


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.


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”.


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]

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ć.


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

Dla podfolderu


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 

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 =>. !!!


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]

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]

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>

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);
        }
    }
});

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]

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

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]

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


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.


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


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]

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]

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.