URL Apache VirtualHost içinde yönlendirilsin mi?


61

Üzerinde bazı VirtualHosts kurduğum Apache ile özel bir sunucum var. Birini www etki alanının yanı sıra www olmayan etki alanının da ele alınması için ayarladım.

Www için VH .conf dosyam:

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

Bununla .htaccess:

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

Www'yi www olmayan sürümüne yönlendirmenin basit bir yolu var mı? Şu anda aynı iki sürümü de gönderiyorum DocumentRootve kullanıyorum, .htaccessancak bunu VirtualHost dosyasında yapabilmem gerektiğinden eminim.


Yanıtlar:


105

mod_rewriteVirtualHosts dosyasında kuralların dışında kuralların iyi olduğu ortaya çıkar RewriteBase. Ben bununla bitti:

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

EDIT: yorumlarda joschi'nin tavsiyesi üzerine, şu Redirectyönergeleri kullanarak şu basitleştirilmiş sürümü kullanıyorum mod_alias:

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

2
Bunun için mod_rewrite gerekmez. Bunun yerine mod_alias ve onun RedirectPermanent yönergesini kullanın.
joschi

@joschi: Bunun avantajı ne olurdu? Daha hızlı mı?
DisgruntledGoat

12
Müşteriyi sadece yönlendirmek için tam donanımlı yeniden yazma motoruna tüm kontrolleri ve olasılıkları gerekmiyor. Mod_alias mod_rewrite kadar karmaşık olmadığından ve mod_rewrite olan iki yerine sadece bir yönergeye (RedirectPermanent) ihtiyaç duyacağınız için (marjinal olarak) daha hızlı olacaktır. Ve son fakat en az değil, IMHO birisi ilk defa baktığında yapılandırmada ne olduğunu anlamak daha kolaydır.
joschi

1
Bazı garip sebeplerden dolayı Redirect 301 .. bizim için işe yaramadı. RewriteRule seçeneğini kullanmak zorunda kaldık.
so_mv

NOT: dahil değil Windows Server 2008 R2 Enterprise WAMPServer 2.0 üzerinde PHP 5.3.0 Kullanılması :80sonra VirtualHost *nedenler her şeyi "Yasak" dönmek için!
Cees Timmerman

4

Eğer domain erişmeye çalıştığında bu tarayıcı ne göreceksiniz kontrolünü verecek anlamı - varsayılan olarak, 301 yönlendirmesi alan bir tarayıcı kalıcı olarak saklar, çünkü 301 yönlendirmeleriyle çok dikkatli olun www.example.com.

Bu tartışma örneğine bakın http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Bu nedenle, önbelleğe alınmadığından emin olun veya mod_proxy kullanın (mod_proxy'yi öneririm).

Kullanıcının, tarayıcının adres çubuğundaki URL değişikliğini görmesine izin vermekte sorun yaşıyorsanız, mod_rewrite kullanın:

<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>

"Yönlendirme" nin kullanıcıya görünmez olmasını istiyorsanız, mod_proxy kullanın:

<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>

Mod_proxy'nin kötü yapılandırıldığında ağınıza zarar verebileceği belirtilmelidir.


5
301'in amacı kalıcı bir yönlendirme olduğu; Kalıcı olmayan bir yönlendirme istiyorsanız, bunun yerine 302 veya 307 kullanmanız gerekir.
nickgrim

2

Ekleyebilirsin ServerAlias example.com, VirtualHostancak performans yeniden yönlendirmeden farklı olacaktır.

Düzenle

Yönlendirme yapmak istediğiniz ve gelişmiş bir işlevselliğe ihtiyaç duymadığınız için, kullanmanız Redirectsizin için yeterli olmalı. Sen koyardı Redirectbir VirtualHost bölümü altında.

Bir müşteri tarafı çözümü bir meta refreshetiket kullanmak olacaktır .


Biraz daha açıklayabilir misiniz? Nasıl yönlendirir: www.example.comiçin example.combu yöntemi kullanarak?
DisgruntledGoat

Birincil vhost'unuzda, hem ServerNameve için girişleriniz var ServerAlias. Birinde example.com ve diğer www.example.com vardır. Ardından, her iki dns girişi aynı vhost'ta belirtilen belgelere erişecektir.
Warner

Yönlendirme yapmak istiyorum , sadece takma ad değil.
Hoşnutsuz Goat

O zaman joshchi'nin önerisi sizin için iyi bir yaklaşım olabilir. Bu noktada tüyler ayrılıyor gibi görünüyor.
Warner

1

peki, SERVERNAME www.example.com için bir sanal ana bilgisayar oluşturabilir ve ornekame example.com ile başka bir sanal ana bilgisayara yönlendirmesini sağlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.