reindirizzamento di apache da non www a www

Ho un sito web che non sembra redirect da non www a www.

La mia configurazione di Apache è la seguente:

RewriteEngine On ### re-direct to www RewriteCond %{http_host} !^www.example.com [nc] RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Cosa mi manca?

Usare il motore di riscrittura è un modo abbastanza pesante per risolvere questo problema. Ecco una soluzione più semplice:

  ServerName example.com Redirect permanent / http://www.example.com/   ServerName www.example.com # real server configuration  

E poi avrai un’altra sezione con ServerName www.example.com per la configurazione del tuo vero server. Apache conserva automaticamente qualsiasi cosa dopo / durante l’uso della direttiva Redirect , che è un malinteso comune sul perché questo metodo non funzionerà (quando in realtà lo fa).

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] 
  ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1  

Per rimuovere www dal tuo sito web URL usa questo codice nel tuo file .htaccess :

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

Per forzare www URL tuo sito web usa questo codice su .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] 

Dove YourSite.com deve essere sostituito con il tuo URL .

   DocumentRoot "what/ever/root/to/source" ServerName www.example.com  Options FollowSymLinks MultiViews Includes ExecCGI AllowOverride All Order allow,deny allow from all     ServerName example.com ServerAlias *.example.com Redirect permanent / http://www.example.com/  

Questo è ciò che accade con il codice sopra. Il primo blocco host virtuale controlla se la richiesta è http://www.example.com e gestisce il tuo sito web in quella directory.

In mancanza di ciò, si tratta della seconda sezione dell’host virtuale. Qui qualsiasi cosa diversa da http://www.example.com viene reindirizzata a http://www.example.com.

L’ordine qui conta. Se aggiungi prima la seconda direttiva virtualhost, causerà un loop di reindirizzamento.

Questa soluzione reindirizzerà qualsiasi richiesta al tuo dominio, su http://www.yourdomain.com.

Saluti!

Questo è simile a molti altri suggerimenti con un paio di miglioramenti:

  • Non c’è bisogno di hardcode del dominio (funziona con vhost che accettano domini multipli o tra ambienti)
  • Conserva lo schema (http / https) e ignora gli effetti delle precedenti %{REQUEST_URI} regole.
  • La porzione del percorso non influenzata da precedenti RewriteRule come %{REQUEST_URI} è.

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

Questo inizia con la variabile HTTP_HOST , che contiene solo la porzione del nome di dominio dell’URL in entrata ( example.com ). Supponendo che il nome di dominio non contenga un www. e corrisponde esattamente al tuo nome di dominio, quindi entra in gioco RewriteRule. Il pattern ^(.*)$ Corrisponderà a tutto nel REQUEST_URI , che è la risorsa richiesta nella richiesta HTTP ( foo/blah/index.html ). Lo memorizza in un riferimento all’indietro, che viene quindi utilizzato per riscrivere l’URL con il nuovo nome di dominio (uno che inizia con www ).

[NC] indica la corrispondenza del modello senza distinzione tra maiuscole e minuscole, [R=301] indica un reindirizzamento esterno utilizzando il codice 301 (risorsa spostata in modo permanente) e [L] interrompe ogni ulteriore riscrittura e reindirizza immediatamente.

Ho eseguito questo …

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

Ho bisogno che questo sia universale per più di 25 domini sul nostro nuovo server, quindi questa direttiva è nel mio file virtual.conf in un tag . (dir è padre di tutti i docroot)

Ho dovuto fare un po ‘di hacking sulla regola di riscrittura, però, dato che l’intero docroot veniva portato avanti con il pattern match, nonostante quello che http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dice a riguardo solo roba dopo l’host e il porto.

Codice di reindirizzamento per entrambi non www => www e opposto www => non-www. Nessun dominio e schema hardcoding nel file .htaccess. Quindi verranno mantenuti il ​​dominio di origine e la versione http / https.

APACHE 2.4 E NEWER

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] 

Nota: non funziona su Apache 2.2 dove% {REQUEST_SCHEME} non è disponibile. Per compatibilità con Apache 2.2 usa il codice qui sotto o sostituisci% {REQUEST_SCHEME} con http / https fisso.


APACHE 2.2 E NEWER

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] 

… o versione più breve …

 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] 

… versione più breve non ansible perché% N è disponibile solo dall’ultimo RewriteCond …

Reindirizza domain.tld a www.

Le seguenti righe possono essere aggiunte nelle direttive Apache o nel file .htaccess:

 RewriteEngine on RewriteCond %{HTTP_HOST} . RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
  • Altri sudomains funzionano ancora.
  • Non c’è bisogno di regolare le linee. basta copiarli / incollarli nel posto giusto.

Non dimenticare di applicare le modifiche all’apache se modifichi il vhost.

(basato sul default Drupal7 .htaccess ma dovrebbe funzionare in molti casi)

  ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1  

Questo reindirizzerà non solo il nome del dominio ma anche le pagine interne.come …

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

Se si utilizza Apache 2.4, senza la necessità di abilitare il modulo di riscrittura di apache è ansible utilizzare qualcosa come questo:

 # non-www to www  Redirect 301 "/" "http://www.domain.com/"  

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

controlla questo lavoro perfetto

Non utilizzare sempre Redirect permanent (o perché potrebbe causare problemi)

Se è ansible che tu aggiunga i sottodomini in un secondo momento, non utilizzare il redirect permanent .

Perché se un client ha utilizzato un sottodominio che non è stato registrato come VirtualHost , potrebbe anche non raggiungere questo sottodominio anche se è stato registrato in seguito.

redirect permanent invia un HTTP 301 Moved Permanently al client (browser) e molti di essi memorizzano questa risposta per sempre (fino a quando la cache non viene cancellata [manualmente]). Quindi l’utilizzo di quel sottodominio sarà sempre reindirizzato automaticamente a www. *** senza richiedere nuovamente il server.

vedi Per quanto tempo i browser nascondono gli HTTP 301s?

Quindi usa semplicemente Redirect

  ServerName example.com Redirect / http://www.example.com/  

Apache.org – Quando non usare mod_rewrite

Apache.org – Nomi host Canonical

Prova questo:

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

Ho appena avuto lo stesso problema. Ma risolto con questo

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

Questa regola reindirizza non www a www.

E questa regola per redirect www a non www

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

Fare riferimento a http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

Questo funziona per me:

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

Io uso il modello look-ahead (?!www.domain.com) per escludere il sottodominio www quando reindirizza tutti i domini al sottodominio www per evitare un loop infinito di reindirizzamento in Apache.

Il codice che uso è:

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

Se si utilizza la soluzione precedente di due blocchi con diversi ServerName s …

  ServerName example.com Redirect permanent / http://www.example.com/   ServerName www.example.com  

… quindi devi impostare anche NameVirtualHost On .

Se non lo fai, Apache non si consente di usare i diversi ServerName per distinguere i blocchi, quindi ottieni questo messaggio di errore:

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

… e non avviene alcun reindirizzamento, oppure hai un ciclo di reindirizzamento infinito, a seconda del blocco che hai inserito per primo.

Ho avuto un compito simile su un Multisito WP, in cui la regola di reindirizzamento doveva essere generica (per ogni dominio dato che aggiungerei alla rete). Ho risolto prima l’aggiunta di un carattere jolly al dominio (dominio parcheggiato). Notare la . dopo .com.

 CNAME * domain.com. 

E poi ho aggiunto le seguenti righe al file .htaccess nella radice del mio multisito. Immagino che funzionerebbe per qualsiasi sito.

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

Speriamo che questo possa aiutare.

ps. Se desideri redirect da non www a www, cambia l’ultima riga in

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

Ho trovato più semplice (e più utile) utilizzare ServerAlias ​​quando si utilizzano più vhost.

  ServerName www.example.com ServerAlias example.com ....  

Funziona anche con https vhosts.