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.