Przekieruj non-www na www w .htaccess

189

Mam to w moim pliku .htaccess:

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

ale za każdym razem, gdy uzyskuję dostęp do pliku w moim katalogu głównym, jak http://example.com/robots.txtprzekieruje do http://www.example.comrobots.txt/.

Jak mogę to poprawić, aby poprawnie przekierowywało http://www.example.com/robots.txt?

Paul Sanchez
źródło

Odpowiedzi:

391

Zmień konfigurację na tę (dodaj ukośnik):

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

Lub rozwiązanie opisane poniżej (zaproponowane przez @absiddiqueLive ) będzie działać dla dowolnej domeny:

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

Jeśli potrzebujesz obsługiwać http i https i zachować wybór protokołu, spróbuj wykonać następujące czynności:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Gdzie można wymienić loginsię checkout.phplub cokolwiek URL trzeba wspierać HTTPS.

Twierdziłbym, że to zły pomysł. Aby zapoznać się z uzasadnieniem, przeczytaj tę odpowiedź .

Randall Hunt
źródło
To rozwiązanie nie działa, gdy niektóre strony (takie jak logowanie lub rejestracja) używają protokołu https.
Aleksiej Kosow
Lekko zaktualizowałem post, aby uwzględnić pewne informacje. Trudno jest zarówno ogólnie, jak i poprawnie wybrać protokół, którego należy użyć.
Randall Hunt
3
Pierwsze rozwiązanie nie przekierowuje wystarczająco, drugie wydaje się przekierowywać za dużo. Na przykład blog.example.comstaje sięwww.blog.example.com
gman
Czy możesz również dodać, jak uniknąć przekierowania podczas tworzenia na localhost?
Królik Bugs
śledziłem tu wszystko, ale nic nie działa. Używam konfiguracji laravel. Czy ktoś ma pojęcie, dlaczego to dla mnie nie działa? Zarówno www.domain.com, jak i domain.com ładują się poprawnie, ale domain.com nie przekierowuje na www.domain.com. Czy to może być problem z moim DNS?
hello world
93

Oto prawidłowe rozwiązanie, które obsługuje https i http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Aleksiej Kosow
źródło
7
Jest to idealne, nie przekierowuje również subdomen, wwwtak jak robią to inne ogólne rozwiązania.
Fabian Schmengler,
4
To najlepsze rozwiązanie, działa znacznie lepiej niż zaakceptowana odpowiedź i odpowiednio dba o HTTPS
Tamik Soziev
3
Działa świetnie! I w tak kilku liniach!
zeckdude
8
TO NAJLEPSZA ODPOWIEDŹ
Andrew
8
Jeśli się nie mylę, nie działałoby to dla więcej niż jednej kropki. Przykłady:yoursite.co.uk
TrashyMcTrash
82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Dla HTTP

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddiqueLive
źródło
7
To rozwiązanie jest lepsze niż @ ranman, ponieważ będzie działać dla wszystkich domen, minimalizując w ten sposób błędy ludzkie, zarówno podczas wdrażania kodu dla nowego projektu, jak i podczas wdrażania dodatkowych domen w istniejącym projekcie.
Frankie,
Wolę to rozwiązanie, ale dlaczego ^(.*)$zamiast (.*)?
Popnoodles,
to rozwiązanie jest lepsze, ale edytowałem moje, aby zawierało również twoje.
Randall Hunt
1
Działa to dla wszystkich domen jest proste i skuteczne! Dziękuję
eirenaios,
możesz śledzić RewriteCond% {HTTPS} s ^ on (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddique na żywo
24

Poniższy przykład działa zarówno na ssl, jak i non-ssl i jest znacznie szybszy, ponieważ używasz tylko jednej reguły do ​​zarządzania http i https

RewriteEngine on


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

[Przetestowany]

To przekieruje

http

do

https

do

starkeen
źródło
1
Bardzo blisko tego, co wymyśliłem. Obsługuje także więcej niż jedną kropkę na hoście HTTP, na przykład „mysite.co.uk”.
Adambean
2
Właśnie z ciekawości, dlaczego nie używasz tutaj R = 301? Domyślnie użyje 302 (temp. Przeniesionej), jeśli nie zostanie określony kod.
Marc
1
Działa świetnie. To powinna być zaakceptowana odpowiedź.
James Nisbet
8

Spróbuj tego, użyłem go na wielu stronach internetowych, działa idealnie

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
źródło
4

Przetestowałem wszystkie powyższe rozwiązania, ale nie działało dla mnie, próbowałem usunąć http: // i nie przekierowuję również usunąłem dobrze www przekierowanie, więc się mylę, szczególnie prowadzę wszystkie moje strony pod https : //

Połączyłem więc niektóre kody razem i opracowałem idealne rozwiązanie dla http: // i https: // oraz www i innych niż www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Mam nadzieję, że to może komuś pomóc :)

Gry Mizo
źródło
3

Ta konfiguracja działała dla mnie w bitnami wordpress ze skonfigurowanym SSL:

Dodano poniżej „RewriteEngine On” w pliku /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
źródło
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

To przekieruje twoją domenę, która nie została uruchomiona przez WWW. To nie przekieruje twojej całej subdomeny.

To jest użyteczne.

Ashish Gondaliya
źródło
2

Uważam, że najlepsza odpowiedź z powodzeniem przekierowuje stronę inną niż www na www (np. Mysite.com -> www.mysite.com ), ale nie uwzględnia poddomen wieloznacznych, co powoduje:

random.mysite.com -> www.random.mysite.com

Oto rozwiązanie z / bez HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* Uwaga: Nie testowałem https, ponieważ obecnie nie mam certyfikatu do przetestowania, ale jeśli ktoś może zweryfikować lub zoptymalizować to, co mam, byłoby to niesamowite.

Łowca Frazier
źródło
Co robi pierwszy $ tutaj: '^ (. *) $'
Vaishal Patel
0

Jeśli to możliwe, dodaj to do głównego pliku konfiguracyjnego Apache. Jest to rozwiązanie lżejsze, wymagające mniej przetwarzania.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Tak więc osobne VirtualHostdla „example.com” przechwytuje te żądania, a następnie trwale przekierowuje je do głównej VirtualHost. Nie ma zatem analizy składni REGEX przy każdym żądaniu, a przeglądarki klienta buforują przekierowanie, więc nigdy (lub rzadko) nie będą ponownie żądały „niewłaściwego” adresu URL, co oszczędza obciążenie serwera.

Uwaga, końcowe ukośnik w Redirect permanent / http://www.example.com/. Bez tego przekierowanie z example.com/asdfprzekierowałoby na http://www.example.comasdfzamiast http://www.example.com/asdf.

Buttle Butkus
źródło
0

Dwa ostrzeżenia

Unikaj 301 i preferuj nowoczesne kody stanu odpowiedzi 303 lub 307.

Unikaj 301

Zastanów się, czy naprawdę potrzebujesz wskazanego stałego przekierowania, [R=301]ponieważ jeśli zdecydujesz się go zmienić później, poprzedni odwiedzający stronę będą nadal widzieć stronę pierwotnego przekierowania.

Informacje o stałym przekierowaniu są często przechowywane w pamięci podręcznej przeglądarki i ogólnie trudno je wyeliminować (przeładowanie strony nie rozwiązuje problemu). Odwiedzający Twoją stronę utkną w poprzednim przekierowaniu „na zawsze”.

Unikaj też 302

Nowa wersja protokołu HTTP (v1.1) dodała dwa nowe kody statusu odpowiedzi, których można użyć zamiast 302.

  • 303 Przekierowanie adresu URL, ale wymaga zmiany typu żądania na GET.
  • 307 Przekierowanie adresu URL, ale wymaga zachowania pierwotnie wysłanego typu żądania.

Nadal możesz używać kodu 302(niestałe przekierowanie), chociaż uważa się go za niejednoznaczny. W każdym razie większość przeglądarek implementuje 302w taki sam sposób, jak 303instruuje nowy kod.

ePi272314
źródło
jeśli chodzi o Twoje ostrzeżenie o 301, to będzie obowiązywać, nawet jeśli mówimy o tej samej nazwie domeny? nie jestem pewien, jak to będzie miało zastosowanie w tym przypadku ... przekierowując wszystkie adresy URL od http://example.com/testingdo http://www.example.com/testing. Czy może to być złe podejście na dłuższą metę? Dzięki,
Sara_
-1

Napisz w .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
źródło
1
Takie same jak inne odpowiedzi
Ankit