reindirizzamento di Apache da non www a www


206

Ho un sito web che non sembra reindirizzare 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 sto perdendo?


1
Per una .htaccesssoluzione basata suggerisco una risposta che è stata posta sulla questione diametrale: stackoverflow.com/a/5262044/367456
hakre

questo è buono, aggiunge comunque una barra all'URL, quindi perdi la barra prima del dollaro.
wuxmedia,

Risposte:


510

L'uso del motore di riscrittura è un modo piuttosto pesante per risolvere questo problema. Ecco una soluzione più semplice:

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

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

E poi avrai un'altra <VirtualHost>sezione con ServerName www.example.comper la tua vera configurazione del server. Apache conserva automaticamente qualsiasi cosa dopo l' /uso della Redirectdirettiva , che è un'idea sbagliata comune sul perché questo metodo non funzionerà (quando in realtà funziona).


20
Come si fa per un sito che ha anche un host virtuale SSL?
Shabbyrobe,

28
Viene visualizzato l'errore "La pagina Web su example.com ha comportato troppi reindirizzamenti" durante l'utilizzo di questo suggerimento. Altri hanno questo problema?
Jonathan Berger,

4
@ Black Black: Non c'è niente di magico nel farlo nella direzione opposta. Basta scambiare www.examplee exampleovunque appaiano nel campione.
Greg Hewgill,

11
@JonathanBerger Se troppi reindirizzamenti, probabilmente il file non è stato configurato correttamente. Assicurati di avere 2 VirtualHosts: uno con non-www che è il precedente e l'altro con ServerName www.example.com che ha la configurazione reale. Assicurati anche di non avere un reindirizzamento anche nella configurazione di www.example.com (sia mod_alias che mod_rewrite).
Savas Vedova,

3
Per un server host virtuale, ad esempio esempio.com, ho Redirect 301 / http://example2.com/extra/ma quando reindirizza, manca la barra finale, il che significa che example.com/blahva example2.com/extrablah. Qualche idea? (Apache 2.2.22)
Peter Howe,

88

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]

3
risposta molto breve ... ma ai punti ... non sono sicuro che si tratti di un voto
positivo

2
Oh, è pulito, questo può essere incluso nella configurazione del server al livello più alto (e in tal caso) si applicherà a ogni host virtuale!
thenickdude,

Ciao @burzumko come riesci a raggiungere questo obiettivo, il che è vero per tutti senza www, ma poi, diciamo, example.com/subdi1/ws/* passare senza www?
sensei nero

1
Ho usato questa soluzione anche per host virtuali HTTPS. Basta aggiungere un sa http nella terza riga.
Rodrigoap,

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Questo non ha funzionato per me; ha causato un ciclo di reindirizzamento infinito nello stesso sito
dmiller309,

1
@ dmiller309: ti è capitato di aver incluso www.nel ServerAlias?
Cherouvim,

2
Hai ragione, ho accidentalmente messo www. in ServerAlias ​​usando *. carta jolly. Perché ho incasinato l'ordinamento delle voci di VirtualHost, il *. il jolly ha avuto l'opportunità di abbinarsi quando non pensavo che sarebbe successo.
dmiller309,

7
Questa è la risposta migliore, perché è pulita, mantiene il percorso (a differenza della risposta n. 1) e non usa Riscrivi.
schieferstapel,

30

Per rimuovere wwwdal tuo URLsito web usa questo codice nel tuo .htaccessfile:

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

Per forzare wwwnel tuo sito web URLusa 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.comdeve essere sostituito con il tuo URL.


La migliore risposta qui, poiché funziona per siti Web con più nomi di dominio <3
Clement Herreman,

2
Qual è la seconda parte con .html per ??
Nathan H,

6
Rimuovi la barra prima di $ 1 per non avere una doppia barra (//) dopo il reindirizzamento => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion

22
    <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>

Questo è ciò che accade con il codice sopra. Il primo blocco host virtuale verifica se la richiesta è www.esempio.com ed esegue il tuo sito Web in quella directory.

In caso contrario, si tratta della seconda sezione di host virtuale. Qui qualsiasi cosa diversa da www.esempio.com viene reindirizzata a www.esempio.com.

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

Questa soluzione reindirizzerà qualsiasi richiesta al tuo dominio, su www.tuodominio.com.

Saluti!


16

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

  • Non c'è bisogno di codificare il dominio (funziona con vhosts che accettano più domini o tra ambienti)
  • Preserva lo schema (http / https) e ignora gli effetti delle %{REQUEST_URI}regole precedenti .
  • La parte di percorso non influenzata da precedenti RewriteRules come %{REQUEST_URI}IS.

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

4
Quasi perfetto. Deve essere% {HTTP_HOST} $ 1, non% {HTTP_HOST} / $ 1 (o raddoppierà la barra)
Michael Wyraz

@Michael Wyraz: qui non raddoppia la barra ?!
not2savvy,

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

Questo inizia con la HTTP_HOSTvariabile, che contiene solo la parte del nome di dominio dell'URL in entrata ( example.com). Supponendo che il nome del dominio non contenga a www.e corrisponda esattamente al nome del tuo dominio, entra in gioco RewriteRule. Il modello ^(.*)$corrisponderà a tutto in REQUEST_URI, che è la risorsa richiesta nella richiesta HTTP ( foo/blah/index.html). Memorizza questo in un riferimento posteriore, che viene quindi utilizzato per riscrivere l'URL con il nuovo nome di dominio (uno che inizia conwww ).

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


6

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

APACHE 2.4 E NOVITÀ

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, utilizzare il codice seguente o sostituire% {REQUEST_SCHEME} con http / https fisso.


APACHE 2.2 E NOVITÀ

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ù corta ...

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 possibile perché% N è disponibile solo dall'ultimo RewriteCond ...


La configurazione di Apache 2.4 ha risolto il problema, grazie per la risposta pulita .. !!
KimchiMan

5

Ho corso 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 oltre 25 domini sul nostro nuovo server, quindi questa direttiva è nel mio file virtual.conf in un tag <Directory>. (dir è genitore di tutti i docroot)

Tuttavia, ho dovuto fare un po 'di hacking sulla regola di riscrittura, poiché l'intera documentazione veniva eseguita sulla corrispondenza del modello, nonostante ciò che dice http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html che si tratta solo di roba dopo l'host e la porta.


5

Se stai usando Apache 2.4, senza la necessità di abilitare il modulo di riscrittura di Apache puoi usare qualcosa del genere:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
Risposta sottovalutata. Usando questo, si possono evitare vhosts aggiuntivi, il che è buono per gli script Let'sEncrypt automatizzati.
Paul

Inoltre, se si utilizza ANSIBLE, poiché ANSIBLE 2.0 ora è possibile inserire facilmente un blocco in un file in un'attività, maggiori dettagli qui docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

Reindirizzare domain.tld su 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 sottodomini funzionano ancora.
  • Non è necessario regolare le linee. basta copiarli / incollarli nel posto giusto.

Non dimenticare di applicare le modifiche di Apache se modifichi il vhost.

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


3

Questo è semplice!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Questo reindirizzerà non solo il nome di dominio ma anche le pagine interne. Come ...

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


Grazie per questo. Molto utile.
Anthony,

2

Prova questo:

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

2

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

Se esiste la possibilità che tu aggiunga sottodomini in un secondo momento, non utilizzarlo redirect permanent.

Perché se un client ha utilizzato un sottodominio che non è stato registrato in quanto VirtualHostpotrebbe anche non raggiungere questo sottodominio anche quando viene registrato in un secondo momento.

redirect permanent invia un HTTP 301 Moved Permanently client (browser) e molti di loro memorizzano questa risposta per sempre (fino a quando la cache non viene cancellata [manualmente]). Pertanto, l'utilizzo di quel sottodominio verrà sempre indirizzato automaticamente su www. *** senza richiedere nuovamente il server.

vedi Per quanto tempo i browser memorizzano nella cache gli HTTP 301?

Quindi basta usare Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Quando non usare mod_rewrite

Apache.org - Nomi host canonici


1

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

controlla questo lavoro perfetto


1

-Se si ospitano più nomi di dominio (facoltativo)

-Se tutti quei nomi di dominio utilizzano https (come dovrebbero)

-se si desidera che tutti quei nomi di dominio utilizzino www dot domainName

Ciò eviterà il doppio reindirizzamento (da http: // non www a http: // www e quindi a https: // www)

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

E

<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

È necessario modificare il codice di reindirizzamento 301 in quello più conveniente



0

Questo funziona per me:

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

Uso il modello look-ahead (?!www.domain.com)per escludere il wwwsottodominio quando si reindirizza tutti i domini al wwwsottodominio al fine di evitare un ciclo di reindirizzamento infinito in Apache.


0

Il codice che uso è:

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

-1

Se si utilizza la soluzione precedente di due <VirtualHost *:80>blocchi con diversi ServerNames ...

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

... quindi è necessario impostare NameVirtualHost Onpure .

Se non lo fai, Apache non si consente di usare le diverse ServerNames per distinguere i blocchi, quindi ricevi questo messaggio di errore:

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

... e non si verifica alcun reindirizzamento oppure si ha un ciclo di reindirizzamento infinito, a seconda del blocco che si inserisce per primo.


-1

Avevo un compito simile su un sito WP, in cui la regola di reindirizzamento doveva essere generica (per ogni dato dominio aggiungerei alla rete). Ho risolto prima aggiungendo un carattere jolly al dominio (dominio parcheggiato). Notare la . dopo .com.

CNAME * domain.com.

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

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

Spero che questo possa aiutare.

ps. Se desideri reindirizzare da non www a www, modifica l'ultima riga in

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

-2

Ho trovato più facile (e più utile) utilizzare ServerAlias ​​quando si utilizzano più host.

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

Questo funziona anche con vhosts https.


Un altro downvote drive-by. Ti interessa spiegare, oh potente dio di httpd che non potrebbe essere disturbato a spiegare il downvote?
Anthony,

1
Questo rende possibile avere più domini che ospitano lo stesso sito. A seconda delle tue situazioni e di ciò che sta eseguendo il tuo server web sottostante, avrai problemi con i cookie che non vengono trasferiti, persone confuse e problemi dei motori di ricerca (che vedranno questo come 2 siti diversi).
Jeffrey Van Alstine,
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.