URL di reindirizzamento all'interno di Apache VirtualHost?


61

Ho un server dedicato con Apache, sul quale ho configurato alcuni VirtualHosts. Ne ho impostato uno per gestire il dominio www e il dominio non www.

Il mio file VC .conf per il www:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

Con questo .htaccess:

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

Esiste un modo semplice per reindirizzare il www alla versione non www? Attualmente sto inviando entrambe le versioni allo stesso DocumentRoote usando .htaccessma sono sicuro che devo essere in grado di farlo nel file VirtualHost.


Risposte:


105

Risulta che le mod_rewriteregole vanno bene nel file VirtualHosts, a parte la RewriteBaseregola. Ho finito con questo:

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

EDIT: su consiglio di joschi nei commenti, ora sto usando questa versione semplificata usando la Redirectdirettiva di mod_alias:

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

2
Non è necessario mod_rewrite per questo. Utilizzare invece mod_alias e la sua direttiva RedirectPermanent.
joschi,

@joschi: quale sarebbe il vantaggio di questo? È più veloce?
Sconcertato Goat

12
Non è necessario il motore di riscrittura completo con tutti i suoi controlli e possibilità per reindirizzare il client. Sarebbe (marginalmente) più veloce poiché mod_alias non è così complesso come mod_rewrite e avresti bisogno solo di una direttiva (RedirectPermanent) invece di due con mod_rewrite. E, ultimo ma non meno importante, IMHO è più facile capire cosa succede nella configurazione quando qualcuno la guarda per la prima volta.
joschi

1
Per qualche strana ragione Redirect 301 .. non ha funzionato per noi. Abbiamo dovuto usare l'opzione RewriteRule.
so_mv,

NOTA: L'uso di PHP 5.3.0 su WAMPSERVER 2.0 su Windows Server 2008 R2 Enterprise, escluso il :80dopo, VirtualHost *fa sì che tutto ritorni "Proibito"!
Cees Timmerman,

4

Fai molta attenzione ai reindirizzamenti 301 perché, per impostazione predefinita, un browser che riceve il reindirizzamento 301 lo memorizzerà in modo permanente, il che significa che rinuncerai al controllo su ciò che quel browser vedrà quando tenta di accedere al dominio www.example.com.

Vedi ad esempio questa discussione http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Quindi assicurati che non venga memorizzato nella cache o usa mod_proxy (consiglio mod_proxy).

Se stai bene lasciando che l'utente veda l'URL cambiare nella barra degli indirizzi del browser, usa mod_rewrite:

<VirtualHost *>
 ServerName www.example.com
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^www.example.com
 RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
 Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
 Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>

Se vuoi che il "reindirizzamento" sia invisibile all'utente, usa mod_proxy:

<VirtualHost *>
 ServerName www.example.com
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from 203.0.113.67
 </Proxy>
 ProxyPass / http://example.com/
 ProxyPassReverse / http://example.com/
</VirtualHost>

Va notato che mod_proxy, se configurato in modo errato, può danneggiare la rete.


5
Il punto di un 301 è che è un reindirizzamento permanente ; se si desidera un reindirizzamento non permanente, utilizzare invece 302 o 307.
Nickgrim,

2

È possibile aggiungere ServerAlias example.comal VirtualHostma le prestazioni differiranno da un reindirizzamento.

modificare

Dato che vuoi reindirizzare e non hai bisogno di funzionalità avanzate, sembra che l'uso Redirectdovrebbe bastare per te. Si potrebbe mettere la Redirectforza di una direttiva VirtualHost.

Una soluzione lato client sarebbe quella di utilizzare un meta refreshtag.


Puoi spiegarci un po 'di più? Come faccio a reindirizzare www.example.comad example.comutilizzare questo metodo?
Sconcertato Goat

Nel tuo vhost primario, hai voci per entrambi ServerNamee ServerAlias. Uno ha example.com e l'altro www.example.com. Quindi, entrambe le voci DNS accederanno ai documenti specificati nello stesso vhost.
Warner

Voglio fare un reindirizzamento , non solo un alias.
DisgruntledGoat

Quindi la raccomandazione di Joshchi potrebbe essere un buon approccio per te. Sembra che i peli vengano divisi a questo punto.
Warner

1

bene, potresti creare un host virtuale per SERVERNAME www.example.com e farlo reindirizzare a un altro host virtuale con il nomeserver example.com

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.