Redirect URL dalam Apache VirtualHost?

61

Saya memiliki server khusus dengan Apache, tempat saya mengatur beberapa VirtualHosts. Saya telah menyiapkan satu untuk menangani domain www dan juga domain non-www.

File .conf VH saya untuk www:

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

Dengan ini .htaccess:

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

Apakah ada cara sederhana untuk mengarahkan www ke versi non-www? Saat ini saya mengirim kedua versi ke yang sama DocumentRootdan menggunakan .htaccesstetapi saya yakin saya harus dapat melakukannya di file VirtualHost.

DisgruntledGoat
sumber

Jawaban:

105

Ternyata mod_rewriteaturan baik-baik saja di file VirtualHosts, terlepas dari RewriteBaseaturan. Saya berakhir dengan ini:

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

EDIT: atas saran joschi di komentar, saya sekarang menggunakan versi sederhana ini menggunakan Redirectarahan dari mod_alias:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
DisgruntledGoat
sumber
2
Anda tidak perlu mod_rewrite untuk ini. Gunakan mod_alias dan direktif RedirectPermanent sebagai gantinya.
joschi
@Joschi: Apa keuntungannya? Apakah ini lebih cepat?
DisgruntledGoat
12
Anda tidak perlu mesin penulisan ulang lengkap dengan semua cek dan kemungkinan untuk mengarahkan ulang klien. Ini akan (secara marginal) lebih cepat karena mod_alias tidak sedekat mod_rewrite dan Anda hanya perlu satu arahan (RedirectPermanent) daripada dua dengan mod_rewrite. Dan last but not least IMHO, lebih mudah untuk memahami apa yang terjadi dalam konfigurasi ketika seseorang melihatnya pertama kali.
joschi
1
Untuk beberapa alasan aneh Redirect 301 .. tidak bekerja untuk kita. Kami harus menggunakan opsi RewriteRule.
so_mv
CATATAN: Menggunakan PHP 5.3.0 pada WAMPSERVER 2.0 pada Windows Server 2008 R2 Enterprise, tidak termasuk :80setelah VirtualHost *menyebabkan semuanya kembali "Terlarang"!
Cees Timmerman
4

Berhati-hatilah dengan pengalihan 301 karena, secara default, peramban yang menerima pengalihan 301 akan menyimpannya secara permanen - artinya Anda akan menyerahkan kontrol apa yang akan dilihat peramban itu ketika ia mencoba mengakses domain www.example.com.

Lihat misalnya diskusi ini http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Jadi pastikan itu tidak di-cache, atau gunakan mod_proxy (saya sarankan mod_proxy).

Jika Anda baik-baik saja dengan membiarkan pengguna melihat perubahan URL pada bilah alamat browser, gunakan 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>

Jika Anda ingin "redirect" tidak terlihat oleh pengguna, gunakan 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>

Perlu dicatat bahwa mod_proxy, ketika dikonfigurasi dengan buruk, dapat membahayakan jaringan Anda.

Marco Trevisan
sumber
5
Poin dari 301 adalah itu adalah redirect permanen ; jika Anda ingin pengalihan non-permanen, Anda harus menggunakan 302 atau 307 sebagai gantinya.
jamaah
2

Anda dapat menambahkan ServerAlias example.comke VirtualHosttetapi kinerja akan berbeda dari pengalihan.

Sunting

Karena Anda ingin mengarahkan dan Anda tidak memerlukan fungsionalitas tingkat lanjut, sepertinya menggunakan Redirectsudah cukup bagi Anda. Anda akan menempatkan di Redirectbawah arahan VirtualHost.

Solusi sisi klien adalah menggunakan meta refreshtag.

Warner
sumber
Bisakah Anda jelaskan sedikit lebih jauh? Bagaimana saya akan mengarahkan www.example.comke example.commenggunakan metode ini?
DisgruntledGoat
Di vhost utama Anda, Anda memiliki entri untuk ServerNamedan ServerAlias. Yang satu memiliki example.com dan yang lainnya www.example.com. Kemudian, kedua entri dns akan mengakses dokumen yang ditentukan dalam vhost yang sama.
Warner
Saya ingin melakukan redirect , bukan hanya alias.
DisgruntledGoat
Maka rekomendasi joshchi mungkin merupakan pendekatan yang baik untuk Anda. Sepertinya rambut sedang dipecah pada saat ini.
Warner
1

baik, Anda bisa membuat satu host virtual untuk SERVERNAME www.example.com dan minta dialihkan ke host virtual lain dengan servername example.com

Devin Ceartas
sumber