URL in Apache VirtualHost umleiten?

61

Ich habe einen dedizierten Server mit Apache, auf dem ich einige VirtualHosts eingerichtet habe. Ich habe einen eingerichtet, der sowohl die WWW-Domain als auch die Nicht-WWW-Domain verwaltet.

Meine VH .conf Datei für das www:

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

Mit diesem .htaccess:

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

Gibt es eine einfache Möglichkeit, das WWW auf die Nicht-WWW-Version umzuleiten? Momentan sende ich beide Versionen an dasselbe DocumentRootund benutze, .htaccessaber ich bin mir sicher, dass ich das in der VirtualHost-Datei tun kann.

Verärgerte Ziege
quelle

Antworten:

105

Es stellte sich heraus, dass mod_rewriteRegeln in der VirtualHosts-Datei abgesehen von der RewriteBaseRegel in Ordnung sind . Ich endete damit:

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

EDIT: auf anraten von joschi in den kommentaren verwende ich jetzt diese vereinfachte version mit der Redirectrichtlinie von mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
Verärgerte Ziege
quelle
2
Sie brauchen dafür kein mod_rewrite. Verwenden Sie stattdessen mod_alias und seine RedirectPermanent-Direktive.
Josefi
@joschi: Was wäre der Vorteil davon? Ist es schneller
DisgruntledGoat
12
Sie benötigen nicht die vollständige Rewrite-Engine mit all ihren Überprüfungen und Möglichkeiten, um den Client einfach umzuleiten. Es wäre (geringfügig) schneller, da mod_alias nicht so komplex wie mod_rewrite ist und Sie nur eine Direktive (RedirectPermanent) anstelle von zwei mit mod_rewrite benötigen würden. Und zu guter Letzt ist es meiner Meinung nach einfacher zu verstehen, was in der Konfiguration passiert, wenn sich jemand das erste Mal damit befasst.
joschi
1
Aus irgendeinem Grund hat Redirect 301 .. bei uns nicht funktioniert. Wir mussten die Option RewriteRule verwenden.
so_mv
HINWEIS: Die Verwendung von PHP 5.3.0 unter WAMPSERVER 2.0 unter Windows Server 2008 R2 Enterprise (ohne :80after) führt dazu, VirtualHost *dass alles "Verboten" zurückgibt !
Cees Timmerman
4

Seien Sie bei 301-Weiterleitungen sehr vorsichtig, da ein Browser, der die 301-Weiterleitung empfängt, diese standardmäßig dauerhaft speichert. Dies bedeutet, dass Sie die Kontrolle darüber aufgeben, was dieser Browser sieht, wenn er versucht, auf die Domain zuzugreifen www.example.com.

Siehe zum Beispiel diese Diskussion http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Stellen Sie also entweder sicher, dass es nicht zwischengespeichert wird, oder verwenden Sie mod_proxy (ich empfehle mod_proxy).

Wenn Sie dem Benutzer die Änderung der URL in der Adressleiste des Browsers anzeigen möchten, verwenden Sie 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>

Wenn die "Weiterleitung" für den Benutzer unsichtbar sein soll, verwenden Sie 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>

Es sollte beachtet werden, dass mod_proxy, wenn es falsch konfiguriert ist, Ihr Netzwerk beschädigen kann.

Marco Trevisan
quelle
5
Der Punkt eines 301 ist, dass es eine permanente Weiterleitung ist; Wenn Sie eine nicht permanente Weiterleitung wünschen, sollten Sie stattdessen 302 oder 307 verwenden.
Nickgrim
2

Sie können hinzufügen ServerAlias example.com, VirtualHostaber die Leistung unterscheidet sich von einer Umleitung.

Bearbeiten

Da Sie umleiten möchten und keine erweiterten Funktionen benötigen, Redirectsollte die Verwendung für Sie ausreichen. Sie würden das Redirectunter eine VirtualHost-Direktive stellen.

Eine clientseitige Lösung wäre die Verwendung eines meta refreshTags.

Warner
quelle
Können Sie das etwas näher erläutern? Wie würde ich www.example.comzur example.comVerwendung dieser Methode umleiten ?
DisgruntledGoat
In Ihrem primären vhost haben Sie Einträge für beide ServerNameund ServerAlias. Einer hat example.com und der andere www.example.com. Dann greifen beide DNS-Einträge auf die im selben vhost angegebenen Dokumente zu.
Warner
Ich möchte jedoch eine Umleitung durchführen , nicht nur einen Alias.
DisgruntledGoat
Dann könnte die Empfehlung von Joshchi ein guter Ansatz für Sie sein. Scheint, als würden an dieser Stelle Haare gespalten.
Warner
1

Nun, Sie können einen virtuellen Host für den SERVERNAME www.example.com erstellen und ihn mit dem Servernamen example.com auf einen anderen virtuellen Host umleiten lassen

Devin Ceartas
quelle