Reindirizzamento htaccess generico da www a non-www


484

Vorrei reindirizzare www.example.coma example.com. Il seguente codice htaccess fa sì che ciò accada:

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

Ma c'è un modo per farlo in modo generico senza codificare il nome di dominio?


64
È importante essere consapevoli del fatto che se non si utilizza un www (o qualche altro sottodominio), tutti i cookie verranno inviati a ogni sottodominio e non sarà possibile avere un sottodominio senza cookie per la pubblicazione di contenuti statici, riducendo così il quantità di dati inviati avanti e indietro tra il browser e il server. Qualcosa di cui potresti pentirti in seguito: twitter.com/codinghorror/statuses/1637428313
Sam Hasler,

3
Un'altra cosa da considerare, assicurati di impostare il nome canonico senza il www nelle tue pagine, per evitare una possibile penalità per i contenuti duplicati. Inoltre, se hai URL assoluti nei tuoi link, assicurati che siano anche tutti non www.
Jeremy Morgan,

Nella mia mente è meglio mantenere il reindirizzamento esplicito, specialmente quando si copia la configurazione per un altro dominio, che potrebbe richiedere una messa a punto diversa (il dominio www è meglio in alcuni casi) weboptimizer.ch/2014/01/redirection-www
snowflake

Qual è il motivo per cui questa soluzione dovrebbe funzionare in tutti i casi tranne l'URL di root? Ad esempio domain.com non si collega a domain.com , mentre domain.com/page1 reindirizza a domain.com/page1 .
Jeff Solomon,

Se si desidera reindirizzare www a non www mantenendo il protocollo (HTTP o HTTPS), vedere questa domanda correlata: Reindirizzare www a non www mantenendo il protocollo HTTP o HTTPS
MrWhite

Risposte:


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

Lo stesso di quello di Michael, tranne questo funziona: P


16
Se non funziona, probabilmente ti manca il RewriteEngine Onprecursore per farlo funzionare.
hendry,

8
@Ben, come dovrei usarlo al contrario, per aggiungere www a un sito Web non www?
anarkhos,

18
Si reindirizza http://www.domain.com/a http://domain.com//. Si dovrebbe aggiungere /al RewruteRule. Questo funziona per me RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov,

13
Stavo avendo lo stesso problema di Vladimir nel reindirizzamento http://domain.com//con le doppie barre. Così ho fatto RewriteRule ^(.*)$ http://%1$1 [R=301,L] e sembra funzionare finora
bobfet1

5
Si prega di utilizzare la seguente soluzione anziché riscrivere il motore, è molto più veloce pur essendo elegante: stackoverflow.com/questions/1100343/…
Birla

111

Ma se dobbiamo farlo per http e https separati:

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

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

2
www.example.com/ reindirizza a example.com// Un modo per rimuovere la barra aggiuntiva?
Bobby S,

Buona domanda. Immagino che la soluzione rapida sarà quella di utilizzare regole aggiuntive (cioè solo per questo caso) prima di queste descritte sopra. Ad esempio: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron,

3
@BobbyS Ho usato la soluzione in questo articolo . Reindirizza www e HTTP a HTTPS non www e gestisce anche il trailing /.
totymedli

Otterresti solo una barra aggiuntiva (all'inizio del percorso URL), se avessi inserito queste direttive direttamente nella configurazione del server (o virtualhost). In .htaccessnon dovresti avere una barra in più. (Solo per notare, se stai eseguendo questo reindirizzamento nella configurazione del server, probabilmente non dovresti usare mod_rewrite per iniziare ... un semplice mod_alias Redirectnel contenitore vhost appropriato sarebbe più efficiente e meno soggetto a errori.)
MrWhite

72

Reindirizzare non www a www (entrambi: http + https)

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

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

4
@nightcoder Questo perché la mia soluzione per il reindirizzamento inverso (da non www a www) rispetto a quella di Andron
Dmitriy

2
Nota: questa soluzione potrebbe causare alcuni problemi se si intende utilizzare i nomi dei sottodomini per altri scopi. Ad esempio, app.tuodominio.com verrà reindirizzato a www.app.tuodominio.com.
Marty ZHANG,

1
Questo è l'esatto contrario di una risposta alla domanda.
Giovanni

Ho dovuto aggiungere RewriteEngine One RewriteBase /, ma per il resto ha funzionato bene.
ripensare


33

Ecco le regole per reindirizzare un URL www a no-www:

#########################
# redirect www to no-www
#########################

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

Ecco le regole per reindirizzare un URL no-www a www:

#########################
# redirect no-www to www
#########################

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

Nota che ho usato NEflag per impedire ad apache di sfuggire alla stringa di query. Senza questo flag, apache cambierà l'URL richiesto http://www.example.com/?foo%20barinhttp://www.example.com/?foo%2250bar


1
puoi scrivere codice per reindirizzare http su https insieme a reindirizzare www su non-www
HYDER ALI

Cambia http: // in https: // per forzarlo su HTTPS quando cambia. Ti consigliamo inoltre di aggiungere un normale reindirizzamento http-> https per il traffico che non viene reindirizzato da queste regole.
Diamondsea,

11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

Il RewriteCondtutto cattura nel HTTP_HOSTvariabili dopo l' www.e lo salva in %1.

I RewriteRulecattura l'URL senza il leader /e lo salva in $1.


1
sans leading "/"- In .htaccess(come indicato nella domanda) non vi è alcun vantaggio /, quindi lo schema non corrisponde mai e il reindirizzamento non avviene mai. (Esiste solo una barra iniziale in un contesto server o virtualhost .) Inoltre, se si dispone di direttive mod_rewrite successive, sarà necessario il Lflag.
Mr White,

7

Prova questo:

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

Se l'host inizia con www, inseriamo l'intero host sull'inizio dell'URL, quindi togliamo "www".


1
RoBorg, sfortunatamente le tue impostazioni non funzionano, se provo questo: example.com/hello/world Finisco qui: example.com/hello/world/world Ho anche dovuto aggiungere una barra dopo% {HTTP_POST} nella First RewriteRule
deepwell,

2
Sto usando Apache / 2.2.9 (Unix). Funziona per www.website, che reindirizza al sito Web Ma per quanto segue: website / test -> va a: websitetest Ho corretto questo aggiungendo un altro / Secondo errore: website / test / n va a websitetest / n / n
deepwell

1
Stesso problema di @deepwell con questo.
neemzy,

I problemi che i lettori precedenti stanno avendo è perché queste direttive sono destinate alla configurazione del server (o vhost), no .htaccess. In un contesto di directory ( .htaccess) dovresti cambiare il primo RewriteRulea leggere: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](richiede Apache 2.2.12+). Nota l'aggiunta della barra e il DPIflag (Discard Path Info) - per evitare che parte del percorso URL apparentemente sia duplicata (che in realtà è "path-info") come indicato nei commenti precedenti. Tuttavia, ci sono direttive più semplici, come spiegato nelle altre risposte.
Mr White,

7

Gestore WWW generico completo, http / https

Non ho visto una risposta completa. Lo uso per gestire l'inclusione nel WWW.

  1. Generico. Non richiede informazioni sul dominio.
  2. Forza il WWW sul dominio primario: www.domain.com
  3. Rimuove il WWW dai sottodomini: sub.domain.com
  4. Conserva lo stato HTTP / HTTPS.
  5. Permette singoli cookie per domini / sottodomini

Per favore fatemi sapere come funziona o se ho lasciato una scappatoia.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

La domanda originale chiede di reindirizzare wwwa non- www. Stai forzando l'inclusione di www.
Vadim,

6

Trovo che ci siano molte informazioni sbagliate sui reindirizzamenti htaccess, trovo. Prima di tutto, assicurati che il tuo sito sia in esecuzione su Unix utilizzando Apache e non su un host Windows se prevedi che questo codice funzioni.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(Assicurati che non ci siano spazi tra le righe di ogni testo, tuttavia; ho aggiunto uno spazio aggiuntivo tra le righe in modo da renderlo a posto in questa finestra.)

Questo è uno snippet di codice che può essere utilizzato per indirizzare la versione www del tuo sito alla versione http: //. Esistono anche altri codici simili che possono essere utilizzati.


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

Per sottocartella


3

Per coloro che devono poter accedere all'intero sito SENZA il prefisso "www".

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

Mare sicuro di aggiungere questo al seguente file

/site/location/.htaccess 

Questo esempio non è completo: non si sta impostando la protosslvariabile di ambiente (questa non è una variabile standard / server). Questo sarà sempre vuoto, quindi reindirizzerà sempre a http. (L'idea alla base dell'impostazione protosslprecedente nel codice è per quando si desidera preservare il protocollo durante il reindirizzamento. Tuttavia, in questi giorni probabilmente si dovrebbe reindirizzare a httpstutto il tempo.)
Mr White

3

Utilizzo di .htaccess per reindirizzare a www o non www:

Inserisci semplicemente le seguenti righe di codice nel tuo file .htaccess principale e root. In entrambi i casi, basta cambiare domain.com con il proprio nome host.

Reindirizzare a www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Reindirizzare a non www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

cambia DOT in =>. !!!


2

Ho usato la regola sopra per fwd www a nessun www e funziona benissimo per la homepage, tuttavia sulle pagine interne che stanno inoltrando a /index.php

Ho trovato questa altra regola nel mio file .htaccess che sta causando questo, ma non sono sicuro di cosa fare al riguardo. Qualsiasi suggerimento sarebbe molto apprezzato:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

Devi inserire le regole di reindirizzamento non www prima di quelle che hai citato.
Vladimir Jovanović,

2

www a non www con https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Se si desidera rimuovere wwwsu entrambi httpe https, utilizzare quanto segue:

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

Questo reindirizza Non ssl

per

E SSL

per

su apache 2.4.*puoi farlo usando una direttiva Redirectwith if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

2

utilizzare: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

O .htaccess:

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

e il metodo PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

1

L'unico modo per farlo funzionare ...

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

1

Se stai forzando www. in url o forzando ssl prototcol, quindi prova a utilizzare possibili variazioni nel file htaccess, come ad esempio:

RewriteEngine On
RewriteBase /

### Forza WWW ###

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

## Force SSL ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## Block IP ###
Ordina Nega, Consenti
Negare da 256.251.0.139
Negare da 199.127.0.259

Apache può ascoltare un'altra porta, ad esempio 81. Quindi, invece di RewriteCond %{SERVER_PORT} 80suggerire di usare un controllo così universale:RewriteCond %{HTTPS} off
Andron,

1

La risposta selezionata e molte altre soluzioni qui hanno lasciato cadere la parte dell'url dopo /, quindi in pratica ha sempre reindirizzato al dominio principale, almeno per me .. Quindi sto aggiungendo un campione funzionante rispettando il percorso completo dopo la barra ..

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

1

Approccio alternativo se la personalizzazione di .htaccess non è l'opzione ideale:

Ho creato un server di reindirizzamento semplice per uso pubblico. Aggiungi semplicemente il record A o CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Maggiori informazioni: https://simpleredirect.net


0

Non sono sicuro del motivo per cui desideri rimuovere www. Ma la versione inversa sarebbe:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

E il vantaggio di questo script è: se hai qualcosa come test.whattimein.com o qualsiasi altro (ambiente per lo sviluppo / test) non reindirizzerà U all'ambiente originale.


2
Se il sottodominio www debba essere incluso o meno è in realtà una questione di preferenza personale e può dipendere dal nome di dominio e dal pubblico di destinazione. Il codice generico pubblicato sopra per reindirizzare www a none-www gestisce anche gli ambienti di test OK, poiché il reindirizzamento si verifica solo quando "www". si verifica un sottodominio.
Mr White,

1
Questa domanda fa l'opposto di ciò che l'utente sta ponendo, che inquina solo il post.
Vadim,

0

Questo è aggiornato per funzionare su Apache 2.4:

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

L'unica modifica rispetto a quella di Michael è rimuovere il [NC], che produce l'errore "AH00665":

L'opzione NoCase per il modello non-regex '-f' non è supportata e verrà ignorata


La risposta precedente non aveva bisogno di "aggiornamento per funzionare su Apache 2.4". L '"avvertimento" che stai citando (AH00665) si riferisce a una direttiva diversa (ad es. Se avevi qualcosa di simile RewriteCond %{REQUEST_FILENAME} !-f [NC]). Il NCflag fa poca differenza in quanto sopra, tuttavia, il motivo per cui il NCflag dovrebbe essere usato qui è quello di catturare la piccola frazione del traffico bot che (erroneamente) invia un nome host maiuscolo.
Mr White,

0

Aggiunto se localhost, ignora il reindirizzamento (a scopo di sviluppo in ambiente locale). Se non localhost AND (non https O è www), reindirizzare a https e non www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Elaborare il codice in modo che l'OP capisca come questo risponde alla domanda.
RyanNerd,

-2

Ciao puoi usare le seguenti regole sul tuo file htaccess:

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

La domanda è una soluzione "generica" ​​che non include il nome di dominio. La tua soluzione fa anche l' opposto completo di quanto richiesto nella domanda (da non www a www, anziché da www a non www) senza spiegazioni.
Mr White,
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.