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

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


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]

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]

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]

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]

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.


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


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.