.htaccess - jak wymusić „www.” w ogólny sposób?

102

Zmieni się to domain.comna www.domain.com:

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

Jak zamienić część „domain”, aby działała w dowolnej domenie?

StackOverflowNewbie
źródło

Odpowiedzi:

249

Użyłbym tej reguły:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Pierwszy warunek sprawdza, czy wartość Host nie jest pusta (w przypadku HTTP / 1.0); druga sprawdza, czy wartość Host nie zaczyna się od www.; sprawdza trzecie HTTPS ( %{HTTPS}jest albo onczy offtak %{HTTPS}sjest albo onsczy offsw przypadku dopasowany). Część zastępująca następnie łączy części informacyjne w pełny adres URL.onssRewriteRule

Gumbo
źródło
31
To rozwiązanie działa tylko wtedy, gdy chcesz, aby wszystkie subdomeny były przekierowywane do www.twojadomena.com. Jeśli chcesz tylko wymusić www, powinieneś zaktualizować drugą linię tak, aby była:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky
2
Nie łapię każdy z moich subdomen przekazywane www.mydomain.com stosując regułę zamieszczonych w pytaniu ...
lol
3
bardzo mądry! Podoba mi się, że wymusiłeś na sprawdzeniu HTTPS zwrócenie litery „S” w grupie przechwytywania, której użyłeś w następnym wierszu. bardzo elegancki
code_monk
Wydaje się uniwersalną odpowiedzią, obejmuje HTTP i normalne protokoły, działa jak urok.
Clain Dsilva
1
Dzięki! Dodałbym RewriteEngine Onjako pierwszy wiersz, aby go uzupełnić, ponieważ może to doprowadzić do błędu serwera 500, jeśli zostanie skopiowany i wklejony tak, jak jest.
Ryan Casas,
44

To zrobi to:

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

Jeśli chcesz przekierować wszystkie żądania niezwiązane z www do Twojej witryny do wersji www, wszystko, co musisz zrobić, to dodać następujący kod do pliku .htaccess:

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

To nie zadziała w przypadku subdomen.

domena.com zostanie poprawnie przekierowana do www.domena.com

ale

images.domain.com zostanie przekierowany na www.images.domain.com

Zamiast sprawdzać, czy subdomena to „nie www”, sprawdź, czy są tam dwie kropki:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
john mccarthy
źródło
Podoba mi się to rozwiązanie. Zresztą, aby osiągnąć to samo z domenami TLD, takimi jak .co.uk?
TylersSN
1
@iUseMagento Teraz po prostu zwiększ kropki, na przykład: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Ściśle mówiąc, twoja TLD jest nadal, .uka twoja domena something.co.)
mirabilos
.co w tym przypadku jest domeną drugiego poziomu i nie jest w rzeczywistości częścią Twojej domeny, gdzie tak jak .uk to kraj z kodem TLD. Szczerze mówiąc, pracując w branży hostingowej i widząc nowe formaty nazw domen, nie widzę obecnych formatów TLD trwałych do niczego innego niż oficjalne zastosowania. rządy, organizacje itp. W niedalekiej przyszłości, kiedy będziesz mógł zarejestrować się na fqdn, np. fred.bloggs za cenę podobną do obowiązujących norm, wtedy osobista sieć będzie wyglądać zupełnie inaczej z punktu widzenia DNS.
Chris
1

Poniższy kod powinien poprzedzać „www” przed każdym żądaniem, które go nie ma, i przekierowywać edytowane żądanie do nowego identyfikatora URI.

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

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

To przekierowuje example.comdo www.example.comwykluczania subdomen.

Amit Verma
źródło
Wydaje mi się, że wysyłanie adresu www.example.com do www.www.example.com haha
Albert Renshaw
@Albert Być może dzieje się tak z powodu pamięci podręcznej przeglądarki. Wyczyść pamięć podręczną i spróbuj ponownie.
Amit Verma
Masz rację! Właśnie uruchomiłem incognito (chrome) i działało dobrze, dzięki!
Albert Renshaw
1
Bardzo podoba mi się ta ogólna zasada. Ale to nie działa w przypadku domain.co.uk, ponieważ zawiera już dwie kropki. Jak można zmienić tę regułę, aby działała również w domenie .co.uk?
Sacha Vorbeck,
1
W przypadku domeny .co.uk i innych sub cctlds to działa: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Ale niestety jest kilka mieszanych wpisane tlds ( wiki.mozilla.org/TLD_List ), na przykład es, które zezwalają na domain.es oraz domain.com.es. Dodanie | es do wyrażenia regularnego dopasowałoby zarówno do domeny.es, jak i do www.domain.es, co nie jest tutaj potrzebne. Muszę znaleźć sposób na poradzenie sobie z tymi mieszanymi sub-cctldami
Sacha Vorbeck
-1

działało to na mnie jak magia

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

SamYah
źródło