Frage URL in Apache VirtualHost umleiten?


Ich habe einen dedizierten Server mit Apache, auf dem ich einige VirtualHosts eingerichtet habe. Ich habe ein eingerichtet, um die www-Domäne sowie die Nicht-www-Domäne zu behandeln.

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 gleich DocumentRoot und verwenden .htaccess aber ich bin mir sicher, dass ich das in der VirtualHost-Datei machen kann.


56
2018-03-08 20:56


Ursprung


stackoverflow.com/questions/42500012/... - rajeev


Antworten:


Stellt sich heraus mod_rewrite Regeln sind in der VirtualHosts - Datei, abgesehen von der RewriteBase Regel. Ich bin damit gelandet:

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

EDIT: auf den Rat von Joschi in den Kommentaren verwende ich jetzt diese vereinfachte Version mit dem Redirect Richtlinie aus mod_alias:

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

101
2018-03-08 21:34



Sie brauchen dafür kein mod_rewrite. Verwenden Sie stattdessen mod_alias und die RedirectPermanent-Direktive. - joschi
@joschi: Was wäre der Vorteil davon? Ist es schneller? - DisgruntledGoat
Sie brauchen nicht die vollwertige Rewrite-Engine mit all ihren Überprüfungen und Möglichkeiten, den Client einfach umzuleiten. Es wäre (marginal) 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. Und zu guter Letzt ist es einfacher zu verstehen, was in der Konfiguration passiert, wenn jemand es das erste Mal anschaut. - joschi
Aus irgendeinem seltsamen Grund hat Redirect 301 .. nicht für uns funktioniert. Wir mussten die RewriteRule-Option verwenden. - so_mv
HINWEIS: Verwenden von PHP 5.3.0 auf WAMPSERVER 2.0 unter Windows Server 2008 R2 Enterprise, ohne :80 nach dem VirtualHost * Ursachen alles "Verboten" zurückgeben! - Cees Timmerman


Seien Sie sehr vorsichtig mit 301-Weiterleitungen, da ein Browser, der die 301-Weiterleitung empfängt, standardmäßig permanent speichert - was bedeutet, dass Sie die Kontrolle darüber verlieren, was der Browser sehen wird, 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/

Also entweder sicherstellen, dass es nicht zwischengespeichert wird, oder mod_proxy verwenden (ich empfehle den mod_proxy).

Wenn Sie mit der Änderung der URL in der Adressleiste des Browsers einverstanden sind, 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 Sie möchten, dass die "Weiterleitung" für den Benutzer unsichtbar ist, 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 schlecht konfiguriert ist, Ihrem Netzwerk schaden kann.


3
2018-01-18 11:29



Der Punkt eines 301 ist, dass es ein ist permanent umleiten; Wenn Sie eine nicht permanente Weiterleitung wünschen, sollten Sie stattdessen 302 oder 307 verwenden. - nickgrim


Du kannst hinzufügen ServerAlias example.com zum VirtualHost aber die Leistung wird sich von einer Weiterleitung unterscheiden.

Bearbeiten

Da Sie umleiten möchten und Sie keine erweiterten Funktionen benötigen, scheint es so zu sein Redirect sollte für dich genügen. Du würdest das setzen Redirect unter einer VirtualHost-Direktive.

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


2
2018-03-08 21:00



Kannst du etwas weiter erklären? Wie würde ich umleiten? www.example.com zu example.com Verwenden Sie diese Methode? - DisgruntledGoat
In Ihrem primären vhost haben Sie Einträge für beide ServerName und ServerAlias. Einer hat example.com und der andere www.example.com. Dann greifen beide DNS-Einträge auf die Dokumente zu, die in demselben vhost angegeben sind. - Warner
Ich möchte ein umleiten obwohl, nicht nur ein Alias. - DisgruntledGoat
Dann kann die Empfehlung von Joshchi ein guter Ansatz für Sie sein. Es scheint, als würden Haare an dieser Stelle gespalten. - Warner


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


1
2018-03-08 21:18