Przekierować URL w Apache VirtualHost?

61

Mam serwer dedykowany z Apache, na którym skonfigurowałem niektóre VirtualHosty. Skonfigurowałem jeden do obsługi domeny www oraz domeny innej niż www.

Mój plik VH .conf dla strony www:

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

Z tym .htaccess:

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

Czy istnieje prosty sposób przekierowania strony www do wersji innej niż www? Obecnie wysyłam obie wersje do tego samego DocumentRooti używam, .htaccessale jestem pewien, że muszę to zrobić w pliku VirtualHost.

DisgruntledGoat
źródło

Odpowiedzi:

105

Okazuje się, że mod_rewritereguły są poprawne w pliku VirtualHosts, poza RewriteBaseregułą. Skończyło się na tym:

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

EDYCJA: zgodnie z radą Joschi w komentarzach, teraz używam tej uproszczonej wersji przy użyciu Redirectdyrektywy z mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
DisgruntledGoat
źródło
2
Nie potrzebujesz do tego mod_rewrite. Zamiast tego użyj mod_alias i jego dyrektywy RedirectPermanent.
joschi,
@joschi: Jaka byłaby z tego zaleta? Czy to jest szybsze?
DisgruntledGoat
12
Nie potrzebujesz w pełni funkcjonalnego silnika przepisywania ze wszystkimi jego kontrolami i możliwościami przekierowania klienta. Byłoby (marginalnie) szybsze, ponieważ mod_alias nie jest tak skomplikowany jak mod_rewrite i potrzebowałabyś tylko jednej dyrektywy (RedirectPermanent) zamiast dwóch z mod_rewrite. I na koniec IMHO łatwiej zrozumieć, co dzieje się w konfiguracji, gdy ktoś na to patrzy po raz pierwszy.
joschi,
1
Z jakiegoś dziwnego powodu Przekierowanie 301 .. nie działało dla nas. Musieliśmy użyć opcji RewriteRule.
so_mv
UWAGA: Używanie PHP 5.3.0 na WAMPSERVER 2.0 w systemie Windows Server 2008 R2 Enterprise, bez uwzględnienia :80po VirtualHost *powoduje, że wszystko zwraca „Zabronione”!
Cees Timmerman,
4

Bądź bardzo ostrożny z przekierowaniami 301, ponieważ domyślnie przeglądarka, która odbiera przekierowanie 301, będzie je przechowywać na stałe - co oznacza, że ​​stracisz kontrolę nad tym, co przeglądarka zobaczy, gdy będzie próbowała uzyskać dostęp do domeny www.example.com.

Zobacz na przykład tę dyskusję http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Więc albo upewnij się, że się nie buforuje, albo użyj mod_proxy (polecam mod_proxy).

Jeśli nie masz nic przeciwko temu, aby użytkownik zobaczył zmianę adresu URL na pasku adresu przeglądarki, użyj 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>

Jeśli chcesz, aby „przekierowanie” było niewidoczne dla użytkownika, użyj 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>

Należy zauważyć, że źle skonfigurowany mod_proxy może uszkodzić sieć.

Marco Trevisan
źródło
5
Chodzi o to, że 301 jest to stałe przekierowanie; jeśli chcesz nietrwałego przekierowania, powinieneś użyć 302 lub 307 zamiast tego.
nickgrim
2

Możesz dodać ServerAlias example.comdo, VirtualHostale wydajność będzie się różnić od przekierowania.

Edytować

Ponieważ chcesz przekierować i nie potrzebujesz zaawansowanych funkcji, wydaje się, że używanie Redirectpowinno wystarczyć. Można by umieścić Redirectpod dyrektywy wirtualnego hosta.

Rozwiązaniem po stronie klienta byłoby użycie meta refreshtagu.

Warner
źródło
Czy możesz wyjaśnić coś więcej? Jak mogę przekierować www.example.comna example.comtę metodę?
DisgruntledGoat
W twoim głównym vhost masz wpisy dla obu ServerNamei ServerAlias. Jeden ma example.com, a drugi www.example.com. Następnie oba wpisy dns uzyskają dostęp do dokumentów określonych na tym samym vhost.
Warner
Chcę jednak dokonać przekierowania , a nie tylko aliasu.
DisgruntledGoat
Zatem zalecenie Joshchi może być dla ciebie dobrym podejściem. Wygląda na to, że włosy są w tym momencie dzielone.
Warner
1

cóż, możesz utworzyć jeden wirtualny host dla SERVERNAME www.example.com i przekierować go do innego wirtualnego hosta o nazwie server example.com

Devin Ceartas
źródło