Apache przekierowanie z non www do www

Mam stronę internetową, która nie wydaje się przekierowywać z non-www do www.

moja konfiguracja Apache jest następująca:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 
Co mi umyka?
Author: Simon Hayter, 2009-07-09

21 answers

Użycie silnika rewrite jest dość ciężkim sposobem na rozwiązanie tego problemu. Oto prostsze rozwiązanie:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

I wtedy będziesz miał kolejną <VirtualHost> sekcja z ServerName www.example.com dla Twojej PRAWDZIWEJ konfiguracji serwera. Apache automatycznie zachowuje wszystko po / podczas korzystania z Redirect dyrektywa , która jest powszechnym błędnym przekonaniem, dlaczego ta metoda nie będzie działać(podczas gdy w rzeczywistości działa).

 453
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-07 15:09:34

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 66
Author: burzumko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 16:18:46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
 42
Author: cherouvim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 20:32:05

Aby usunąć www ze swojej strony URL Użyj tego kodu w pliku .htaccess:

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

Aby wymusić www na swojej stronie URL Użyj tego kodu na .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Gdzie {[8] } należy zastąpić URL.

 30
Author: kloddant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 20:42:07
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

Tak się dzieje z powyższym kodem. Pierwszy wirtualny blok hosta sprawdza, czy żądanie jest www.example.com i prowadzi Twoją stronę w tym katalogu.

W przeciwnym razie dochodzi do drugiej sekcji wirtualnego hosta. Tutaj Wszystko inne niż www.example.com jest przekierowany do www.example.com.

Kolejność tutaj ma znaczenie. Jeśli najpierw dodasz drugą dyrektywę virtualhost, spowoduje to pętlę przekierowania.

To rozwiązanie przekieruje każde żądanie do Twojej domeny, na www.yourdomain.com.

Zdrówko!
 20
Author: Dishan Philips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 16:11:12

Jest to podobne do wielu innych sugestii z kilkoma ulepszeniami:

  • nie ma potrzeby twardego kodowania domeny (działa z vhostami, które akceptują wiele domen lub między środowiskami)
  • zachowuje schemat (http / https) i ignoruje efekty poprzednich reguł %{REQUEST_URI}.
  • Część ścieżki, na którą nie miały wpływu poprzednie RewriteRuleS jak %{REQUEST_URI} jest.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
 12
Author: weotch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-17 18:21:01
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Zaczyna się od zmiennej HTTP_HOST, która zawiera tylko część nazwy domeny przychodzącego adresu URL (example.com). Zakładając, że nazwa domeny nie zawiera www. i dokładnie pasuje do nazwy domeny, wtedy w grę wchodzi RewriteRule. Wzorzec ^(.*)$ będzie pasował do wszystkiego w REQUEST_URI, który jest zasobem wymaganym w żądaniu HTTP (foo/blah/index.html). Przechowuje to w back reference, który jest następnie używany do przepisania adresu URL z nową nazwą domeny (która zaczyna się od www).

[NC] wskazuje dopasowanie wzorca bez rozróżniania wielkości liter, [R=301] wskazuje zewnętrzne przekierowanie za pomocą kodu 301 (zasób przeniesiony na stałe), a [L] zatrzymuje wszelkie dalsze przepisywanie i przekierowania natychmiast.

 10
Author: Curtis Tasker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 21:20:17

Sprawdziłam to...

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

Chcę, aby to było uniwersalne dla domen 25+ na naszym nowym serwerze, więc ta dyrektywa jest w moim wirtualnym.plik conf w tagu . (dir jest rodzicem dla wszystkich docroots)

Musiałem trochę zhakować regułę przepisywania, ponieważ pełny docroot był przenoszony na pattern match, pomimo tego, co http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html mówi o tym, że to tylko rzeczy po hosta i portu.

 5
Author: Andrew Deal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-15 23:39:10

Kod przekierowania dla obu Nie-www = > www i przeciwnych www = > non-www. Brak twardych domen i schematów w .plik htaccess. Tak więc oryginalna Domena i wersja http / https zostaną zachowane.

APACHE 2.4 I NOWSZE

NON-WWW = > WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW = > NON-WWW:

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

Uwaga: nie działa na Apache 2.2, gdzie %{REQUEST_SCHEME} nie jest dostępne. Dla kompatybilności z Apache 2.2 użyj poniższego kodu lub zamień %{REQUEST_SCHEME} na fixed http / https.


APACHE 2.2 I NOWSZE

NON-WWW = > WWW:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... albo krótsza wersja ...

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

WWW = > NON-WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

... krótsza wersja nie jest możliwa, ponieważ %N jest dostępne tylko z ostatniej sekundy zapisu ...

 4
Author: mikep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-20 19:13:12

Przekierowanie domeny.tld do www.

Następujące linie mogą być dodane albo w dyrektywach Apache, albo w .plik htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Inne sudomainy nadal działają.
  • nie ma potrzeby dostosowywania linii. wystarczy skopiować/wkleić je we właściwe miejsce.

Nie zapomnij zastosować zmian apache, jeśli zmodyfikujesz vhost.

(na podstawie domyślnego Drupal7 .htaccess, ale powinno działać w wielu przypadkach)

 3
Author: xaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-28 15:04:44
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Spowoduje to przekierowanie nie tylko nazwy domeny, ale także wewnętrznej stron.na przykład...

example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

 2
Author: Aneesh R S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 07:00:39

Jeśli używasz Apache 2.4, bez potrzeby włączania modułu rewrite apache możesz użyć czegoś takiego:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
 2
Author: sys0dm1n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 09:41:57

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

Sprawdź to idealne dzieło

 1
Author: Tejinder singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-28 07:17:44

Nie zawsze używać Redirect permanent (lub dlaczego może powodować problemy)

Jeśli istnieje szansa, że dodasz subdomeny później, nie używaj redirect permanent.

Ponieważ jeśli klient użył subdomeny, która nie została zarejestrowana jako VirtualHost, może również nigdy nie dotrzeć do tej subdomeny, nawet jeśli zostanie zarejestrowana później.

redirect permanent wysyła HTTP 301 Moved Permanently do klienta (przeglądarki) i wiele z nich buforuje tę odpowiedź na zawsze (dopóki pamięć podręczna nie zostanie wyczyszczona [ręcznie]). Więc korzystanie z tej subdomeny będzie zawsze autoredirect do www.*** bez ponownego żądania serwera.

Zobacz Jak długo przeglądarki buforują HTTP 301S?

Więc po prostu użyj Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - kiedy nie używać mod_rewrite

Apache.org -Kanoniczne Nazwy Hostów

 1
Author: MA-Maddin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:13

Spróbuj tego:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
 1
Author: Mark Ursino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 21:21:28

Mam ten sam problem. Ale rozwiązane z tym

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

Ta reguła przekierowuje nie-www do www.

I ta zasada przekierowywania www na nie-www

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

Zobacz od http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

 0
Author: Santo Doni Romadhoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 11:33:59

To działa dla mnie:

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

Używam wzorca look-ahead (?!www.domain.com), aby wykluczyć subdomenę www podczas przekierowywania wszystkich domen do subdomeny www, aby uniknąć nieskończonej pętli przekierowania w Apache.

 0
Author: Mauricio Sánchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-05 21:03:09

Kod, którego używam to:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
 0
Author: user3597887,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 21:22:14

W przypadku zastosowania powyższego rozwiązania dwóch <VirtualHost *:80> bloków o różnych ServerNames...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... następnie należy ustawić NameVirtualHost On oraz .

Jeśli tego nie zrobisz, Apache nie pozwala sobie na używanie różnych ServerNames do rozróżniania bloków, więc otrzymasz komunikat o błędzie:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

...albo nie ma przekierowania, albo masz nieskończoną pętlę przekierowania, w zależności od tego, który blok umieścisz pierwszy.

 -1
Author: Stuart Caie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 11:07:48

Miałem podobne zadanie na multisite WP, gdzie reguła przekierowania musiała być ogólna (dla każdej domeny dodałbym do sieci). Rozwiązałem najpierw dodanie wildcard do domeny(domena zaparkowana). Uwaga . po. com.

CNAME * domain.com.

A następnie dodałem następujące wiersze do.plik htaccess w katalogu głównym mojego multisite. Myślę, że to zadziała na każdą stronę.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Mam nadzieję, że to pomoże.

Ps. Jeśli chcesz przekierować z not www do www, Zmień ostatnią linię do

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
 -1
Author: Carlo Rizzante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 20:44:58

Okazało się, że łatwiej (i bardziej użyteczne) używać serwerów podczas korzystania z wielu vhostów.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Działa to również z HTTPS vhosts.

 -2
Author: Fabian76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 12:11:52