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?

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


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]

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]

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


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]

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 :)



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]

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.


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.


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 me@example.com
   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.


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.


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]

1
Takie same jak inne odpowiedzi
— Ankit
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.