Apache reindirizza da non www a www
-
11-09-2019 - |
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?
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
RewriteRule
s 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
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>
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 ServerName
s ...
<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 ServerName
s 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.