Domanda

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 manca?

È stato utile?

Soluzione

Utilizzando il motore di riscrittura è un modo abbastanza 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 allora avrete un'altra sezione <VirtualHost> con ServerName www.example.com per il server reale configurazione. Apache conserva automaticamente nulla dopo la / quando si utilizza il Redirect direttiva , che è un comune malinteso sul perché questo metodo non funziona (quando in realtà lo fa).

Altri suggerimenti

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

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

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

Per forzare www nel vostro uso URL sito web 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 URL.

    <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 di cui sopra. I primi controlli virtuali blocco host se la richiesta è www.example.com e gestisce il vostro sito in quella directory.

in caso contrario, si tratta della seconda sezione host virtuale. Ecco qualcosa di diverso da www.example.com viene reindirizzato a www.example.com.

L'ordine qui conta. Se si aggiunge la seconda direttiva virtualhost prima, causerà un loop di reindirizzamento.

Questa soluzione reindirizzerà qualsiasi richiesta al dominio, per www.yourdomain.com.

Cheers!

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

  • Non c'è bisogno di codificare il dominio (funziona con vhosts che accettano più domini o tra gli ambienti)
  • Conserve lo schema (http / https) e ignora gli effetti delle regole %{REQUEST_URI} precedenti.
  • La porzione di percorso non interessata dal RewriteRules precedenti 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]

Si inizia con la variabile HTTP_HOST, che contiene solo la parte del nome di dominio del URL in ingresso (example.com). Supponendo che il nome di dominio non contiene un www. e corrisponda al nome di dominio esattamente, allora la RewriteRule entra in gioco. Il ^(.*)$ modello corrisponderà tutto nel REQUEST_URI, che è la risorsa richiesta nella richiesta HTTP (foo/blah/index.html). Memorizza questo in un riferimento, che viene poi utilizzato per riscrivere l'URL con il nuovo nome di dominio (quella che comincia con www).

[NC] indica pattern matching case-insensitive, [R=301] indica un reindirizzamento esterno utilizzando il codice 301 (risorsa spostato permanentemente), e [L] arresta 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 di questo per essere universale per 25+ domini sul nostro nuovo server, in modo da questa direttiva è nel mio file virtual.conf in un tag . (Dir è padre di tutte le docroots)

ho dovuto fare un po 'di hack sulla regola di riscrittura, però, come il pieno docroot veniva portato attraverso il pattern match, nonostante quello che http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dice su di esso solo essere roba dopo che l'host e la porta.

codice reindirizzamento sia non www => www e www opposto => non www. Nessun dominio hardcoding e dei regimi in file .htaccess. Così dominio di origine e HTTP / HTTPS verrà preservata la versione.

APACHE 2.4 e versioni successive

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 la compatibilità con il codice Apache 2.2 Uso di sotto o sostituire% {} REQUEST_SCHEME con fisso HTTP / HTTPS.


Apache 2.2 e versioni successive

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 da ultimo RewriteCond ...

Se si utilizza Apache 2.4, senza la necessità di attivare il modulo riscrittura Apache si può usare qualcosa di simile:

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

Redirect domain.tld a www.

Le seguenti linee possono essere aggiunte sia in direttive di Apache o in 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 stanno ancora lavorando.
  • Non c'è bisogno di regolare le linee. basta copiare / incollare al posto giusto.

Non dimenticare di applicare le modifiche apache se si modifica il vhost.

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

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

Questo reindirizzerà non solo il nome del dominio, ma anche l'interno  pages.like ...
 example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

Prova questo:

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

Questo è semplice!

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

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

controllare questo lavoro perfetto

Non utilizzare allways Redirect permanent (o perché può causare problemi)

Se c'è una possibilità che si aggiungere sottodomini tardi, non utilizzare redirect permanent.

Perché se un cliente ha utilizzato un sottodominio che non era registrato come VirtualHost egli può anche non raggiungono mai questo sottodominio anche quando è registrato in seguito.

redirect permanent invia un HTTP 301 Moved Permanently al client (browser) e molti di loro nella cache questa risposta per sempre (fino a quando la cache viene cancellata [manuale]). Quindi, utilizzando tale sottodominio sarà sempre autoredirect a www. *** senza richiedere nuovamente il server.

Vedere Quanto tempo cache del browser 301s HTTP?

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

Ho appena ho un medesimo problema. Ma risolto con questo

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

Questa regola il reindirizzamento non www a www.

E questa regola per reindirizzare www a non www

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

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 (?!www.domain.com) modello look-ahead per escludere il sottodominio www quando reindirizzare tutti i domini al sottodominio www al fine di evitare un loop di reindirizzamento infinito 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 di cui sopra di due blocchi <VirtualHost *:80> con diversi ServerNames ...

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

... allora si deve impostare NameVirtualHost On così .

Se non si esegue questa operazione, Apache non si lascia usare i diversi ServerNames per distinguere i blocchi, in modo da ottenere questo messaggio di errore:

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

... e neanche nessun reindirizzamento che accade, o si dispone di un loop di reindirizzamento infinito, a seconda di quale blocco si mette prima.

Ho avuto un compito simile su un WP multisito, dove la regola di reindirizzamento doveva essere generico (per un dato dominio mi piacerebbe aggiungere alla rete). Ho risolto prima di aggiungere un jolly per il dominio (dominio parcheggiato). Notare la . dopo .com.

CNAME * domain.com.

E poi ho aggiunto le seguenti righe al file .htaccess alla radice della mia multisito. Credo che in questo modo funziona per qualsiasi sito.

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

Speriamo che questo vi aiuterà.

ps. Se vuoi reindirizzare da non www a www, modificare 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.

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

Funziona anche con vhost https.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top