Reindirizzare non www a www in .htaccess


189

Ho questo nel mio file .htaccess:

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

ma ogni volta che accedo a un file sulla mia radice come http://example.com/robots.txtverrà reindirizzato a http://www.example.comrobots.txt/.

Come posso correggere questo in modo che reindirizzi correttamente a http://www.example.com/robots.txt?

Risposte:


391

Cambia la tua configurazione in questo (aggiungi una barra):

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

Oppure la soluzione descritta di seguito (proposta da @absiddiqueLive ) funzionerà per qualsiasi dominio:

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

Se è necessario supportare http e https e conservare la scelta del protocollo, provare quanto segue:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Dove si sostituisce logincon checkout.phpo qualunque URL sia necessario per supportare HTTPS.

Direi che questa è una cattiva idea. Per il ragionamento , leggi questa risposta .


Questa soluzione non funziona quando alcune pagine (come login o iscrizione) utilizzano il protocollo https.
Alexey Kosov,

Ho aggiornato leggermente il post per includere alcune informazioni. È difficile sia genericamente che correttamente scegliere il protocollo da utilizzare.
Randall Hunt,

3
La prima soluzione non reindirizza abbastanza, la seconda sembra reindirizzare troppo. Ad esempio blog.example.comdiventawww.blog.example.com
gman il

Potresti aggiungere anche come evitare il reindirizzamento durante lo sviluppo su localhost?
Bugs Bunny,

Ho seguito tutto qui ma nulla funziona. Sto usando una configurazione laravel. Qualcuno ha idea del perché questo non funziona per me? www.domain.com e domain.com vengono caricati correttamente ma domain.com non reindirizza a www.domain.com. Potrebbe essere un problema con il mio DNS?
ciao mondo

93

Ecco la soluzione corretta che supporta https e http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
Questo è perfetto, inoltre non reindirizza i sottodomini wwwcome fanno le altre soluzioni generiche.
Fabian Schmengler,

4
Questa è la soluzione migliore, funziona molto meglio della risposta accettata e si occupa correttamente
dell'HTTPS

3
Funziona perfettamente! E in così poche righe!
zeckdude,

8
QUESTA È LA RISPOSTA MIGLIORE
Andrew,

8
Se non sbaglio, questo non funzionerebbe per più di un punto. Esempi:yoursite.co.uk
TrashyMcTrash

83
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Per Https

RewriteCond %{HTTPS}s ^on(s)|

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

8
Questa soluzione è preferita a @ ranman in quanto funzionerà per tutti i domini minimizzando così l'errore umano sia quando si implementa il codice per un nuovo progetto sia quando si implementano domini extra in un progetto esistente.
Frankie,

Preferisco questa soluzione, ma perché ^(.*)$invece di (.*)?
Popnoodles,

questa soluzione è migliore ma ho modificato il mio per contenere anche il tuo.
Randall Hunt,

1
Questo funziona per tutti i domini è semplice ed efficace! Grazie
eirenaios il

puoi seguire RewriteCond% {HTTPS} s ^ on (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive

24

L'esempio seguente funziona sia su ssl che su non-ssl ed è molto più veloce poiché si utilizza una sola regola per gestire http e https

RewriteEngine on


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

[Testato]

Questo reindirizzerà

http

per

https

per


1
Molto vicino a quello che mi è venuto in mente. Supporta anche più di un punto nell'host HTTP, ad esempio "mysite.co.uk".
Adambean,

2
Solo per curiosità, perché non stai usando R = 301 qui? Userà 302 (temperatura spostata) per impostazione predefinita se non viene specificato alcun codice.
Marc,

1
Funziona perfettamente. Questa dovrebbe essere la risposta accettata.
James Nisbet,

8

Prova questo, l'ho usato in molti siti web, funziona perfettamente

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

4

Ho testato tutte le soluzioni di cui sopra ma non funziona per me, ho provato a rimuovere http: // e non reindirizzerò anche rimosso il www reindirizza bene, quindi mi confondo, specialmente sto gestendo tutti i miei siti su https : //

Quindi ho combinato alcuni codici insieme e ho trovato la soluzione perfetta per http: // e https: // e www e non-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>

Spero che questo possa aiutare qualcuno :)



3

Questa configurazione ha funzionato per me in wordpress bitnami con SSL configurato:

Aggiunto sotto sotto "RewriteEngine On" nel file /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]

Questo reindirizzerà il tuo dominio che non è stato avviato con WWW Non reindirizzerà tutto il tuo sottodominio.

È utile.


2

Credo che la risposta migliore reindirizzi con successo non-www a www (es: mysite.com -> www.mysite.com ), ma non tiene conto dei sottodomini con caratteri jolly, il che si traduce in:

random.mysite.com -> www.random.mysite.com

Ecco una soluzione con / senza 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]

* nota: non ho testato https perché al momento non ho un certificato da testare, ma se qualcuno può verificare o ottimizzare ciò che ho sarebbe fantastico.


Cosa fanno i primi $ qui: '^ (. *) $'
Vaishal Patel,

0

Se possibile, aggiungilo al file di configurazione principale di Apache. È una soluzione più leggera, meno elaborazione necessaria.

<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

Quindi, il separato VirtualHostper "esempio.com" acquisisce quelle richieste e poi le reindirizza permanentemente sul tuo principale VirtualHost. Quindi non c'è alcuna analisi REGEX con ogni richiesta e i tuoi browser client memorizzeranno il reindirizzamento nella cache in modo che non richiedano mai (o raramente) di nuovo l'URL "sbagliato", risparmiando sul carico del server.

Nota, la barra finale in Redirect permanent / http://www.example.com/. Senza di essa, un reindirizzamento da example.com/asdfreindirizzerebbe a http://www.example.comasdfanziché http://www.example.com/asdf.


0

Due avvertimenti

Evita 301 e preferisci i moderni codici di stato della risposta 303 o 307.

Evita 301

Pensa attentamente se hai davvero bisogno del reindirizzamento permanente indicato come [R=301]perché se decidi di modificarlo in un secondo momento, i visitatori precedenti della pagina continueranno a vedere la pagina del reindirizzamento originale.

Le informazioni di reindirizzamento permanente sono spesso memorizzate nella cache del browser e, in generale, è difficile da eliminare (ricaricare la pagina non risolve il problema). I visitatori del tuo sito Web rimarranno bloccati nel reindirizzamento precedente "per sempre".

Evita anche 302

La nuova versione del protocollo HTTP (v1.1) ha aggiunto due nuovi codici di stato della risposta che possono essere utilizzati al posto di 302.

  • 303 Reindirizzamento URL ma richiede di cambiare il tipo di richiesta in GET.
  • 307 Reindirizzamento URL ma richiede di mantenere il tipo di richiesta come inizialmente inviato.

Puoi comunque utilizzare il codice 302(reindirizzamento non permanente) sebbene sia considerato ambiguo. In ogni caso, la maggior parte dei browser implementa 302nello stesso modo indicato dal nuovo 303codice.


per quanto riguarda il tuo avviso su 301, questo si applica anche se stiamo parlando dello stesso nome di dominio? non sono sicuro di come si applicherà in questo caso ... reindirizzando tutti gli URL da http://example.com/testinga http://www.example.com/testing. Potrebbe essere un cattivo approccio a lungo termine? Grazie,
Sara_

-1

Scrivi in ​​.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
Come le altre risposte
Ankit,
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.