.htaccess: come forzare "www." in modo generico?


102

Questo cambierà domain.comin www.domain.com:

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

Come faccio a sostituire la parte "dominio" in modo che funzioni su qualsiasi dominio?

Risposte:


249

Userei questa regola:

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]

La prima condizione controlla se il valore Host non è vuoto (in caso di HTTP / 1.0); il secondo controlla se il valore Host non inizia con www.; il terzo controlla per HTTPS ( %{HTTPS}è o ono off, quindi %{HTTPS}sè o onso offse in caso di onsla sè compensata). La parte di sostituzione di RewriteRulequindi unisce semplicemente le parti informative a un URL completo.


31
Questa soluzione funziona solo se desideri inoltrare tutti i sottodomini a www.tuodominio.com. Se vuoi solo forzare www, dovresti aggiornare la seconda riga in modo che sia:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky

2
Non ricevo nessuno dei miei sottodomini inoltrati a www.miodominio.com utilizzando la regola pubblicata nella domanda ...
lol

3
molto intelligente! Mi piace che tu abbia forzato il controllo HTTPS per restituire una "S" nel gruppo di cattura, che hai usato nella riga seguente. molto elegante
code_monk

Sembra una risposta universale, copre HTTP e protocolli normali, funziona a meraviglia.
Clain Dsilva

1
Grazie! Vorrei aggiungere RewriteEngine Oncome prima riga per completarlo, in quanto ciò potrebbe portare a un errore del server 500 se copiato così com'è.
Ryan Casas

44

Questo lo farà:

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

5

Se desideri reindirizzare tutte le richieste non www al tuo sito alla versione www, tutto ciò che devi fare è aggiungere il seguente codice al tuo file .htaccess:

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

3

Questo non funzionerà con i sottodomini.

domain.com viene correttamente reindirizzato a www.domain.com

ma

images.domain.com viene reindirizzato a www.images.domain.com

Invece di controllare se il sottodominio è "non www", controlla se ci sono due punti:

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

Mi piace questa soluzione. Comunque per ottenere la stessa cosa con TLD come .co.uk?
TylersSN

1
@iUseMagentoNow aumenta i punti, ad esempio: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](A rigor di termini, il tuo TLD è fermo .uke il tuo dominio lo è something.co.)
mirabilos

.co in questo caso è un dominio di secondo livello e in realtà non fa parte del tuo dominio dove .uk è un TLD con codice paese. Ad essere onesti, avendo lavorato nel settore dell'hosting e vedendo i nuovi formati per i nomi di dominio, non riesco a vedere gli attuali formati TLD che durano per qualcosa di diverso dagli usi ufficiali. governi, organizzazioni ecc. Nel prossimo futuro, quando potrai registrare fqdn like, fred.bloggs per un prezzo simile alle norme attuali, il web personale apparirà molto diverso dal punto di vista DNS.
Chris

1

Quanto segue dovrebbe anteporre "www" a tutte le richieste che non ne hanno uno e reindirizzare la richiesta modificata al nuovo 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]

Questo reindirizza example.comad www.example.comesclusione sottodomini.


Per me questo sembra inviare www.example.com a www.www.example.com haha
Albert Renshaw

@Albert Forse questo è a causa della cache del browser. Svuota la cache e riprova.
Amit Verma

Hai ragione! Ho appena eseguito in incognito (chrome) e ha funzionato bene, grazie!
Albert Renshaw

1
Mi piace molto questa regola generica. Ma non funziona per dominio.co.uk poiché contiene già due punti. Come è possibile modificare questa regola per farla funzionare anche per .co.uk?
Sacha Vorbeck

1
Per .co.uk e altri sotto cctld funziona: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Ma sfortunatamente ce ne sono alcuni misti digitato tlds ( wiki.mozilla.org/TLD_List ) come es che consentono sia domain.es che domain.com.es. L'aggiunta di | es alla regex corrisponderebbe a domain.es e www.domain.es che non è desiderato qui. Devo trovare un modo per gestire questi sub-cctld di tipo misto
Sacha Vorbeck


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.