Chuyển hướng URL trong Apache Virtualhost?


61

Tôi có một máy chủ chuyên dụng với Apache, trên đó tôi đã thiết lập một số Virtualhost. Tôi đã thiết lập một để xử lý tên miền www cũng như tên miền không có www.

Tệp VH .conf của tôi cho www:

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

Với điều này .htaccess:

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

Có cách nào đơn giản để chuyển hướng www sang phiên bản không có www không? Hiện tại tôi đang gửi cả hai phiên bản giống nhau DocumentRootvà đang sử dụng .htaccessnhưng tôi chắc chắn rằng tôi phải có thể làm điều đó trong tệp Virtualhost.


Câu trả lời:


105

Hóa ra mod_rewritecác quy tắc là tốt trong tệp Virtualhosts, ngoài RewriteBasequy tắc. Tôi đã kết thúc với điều này:

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

EDIT: theo lời khuyên của joschi trong các bình luận, tôi hiện đang sử dụng phiên bản đơn giản hóa này bằng cách sử dụng Redirectchỉ thị từ mod_alias:

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

2
Bạn không cần mod_rewrite cho việc này. Thay vào đó, hãy sử dụng mod_alias và chỉ thị RedirectP Permanent của nó.
joschi

@joschi: lợi thế của điều đó là gì? Có nhanh hơn không?
DisgruntledGoat

12
Bạn không cần công cụ viết lại toàn bộ với tất cả các kiểm tra và khả năng của nó để chỉ chuyển hướng máy khách. Nó sẽ nhanh hơn (một chút) vì mod_alias không phức tạp như mod_rewrite và bạn chỉ cần một lệnh (RedirectP Permanent) thay vì hai với mod_rewrite. Và cuối cùng nhưng không kém IMHO dễ hiểu hơn những gì xảy ra trong cấu hình khi ai đó nhìn vào nó lần đầu tiên.
joschi

1
Vì một số lý do kỳ lạ, Redirect 301 .. không hoạt động với chúng tôi. Chúng tôi đã phải sử dụng tùy chọn RewriteRule.
so_mv

LƯU Ý: Sử dụng PHP 5.3.0 trên WAMPSERVER 2.0 trên Windows Server 2008 R2 Enterprise, không bao gồm :80sau khi VirtualHost *khiến mọi thứ trả về "Bị cấm"!
Cees Timmerman

4

Hãy cẩn thận với chuyển hướng 301 bởi vì theo mặc định, một trình duyệt nhận chuyển hướng 301 sẽ lưu trữ vĩnh viễn - có nghĩa là bạn sẽ từ bỏ quyền kiểm soát những gì trình duyệt đó sẽ thấy khi truy cập vào miền www.example.com.

Xem ví dụ cuộc thảo luận này http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

Vì vậy, hãy chắc chắn rằng nó không được lưu vào bộ nhớ cache hoặc sử dụng mod_proxy (tôi khuyên dùng mod_proxy).

Nếu bạn ổn khi cho phép người dùng thấy thay đổi URL trên thanh địa chỉ trình duyệt, hãy sử dụng 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>

Nếu bạn muốn "chuyển hướng" ẩn với người dùng, hãy sử dụng 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>

Cần lưu ý rằng mod_proxy, khi được cấu hình kém, có thể gây hại cho mạng của bạn.


5
Điểm của 301 là nó là một chuyển hướng vĩnh viễn ; nếu bạn muốn chuyển hướng không cố định, bạn nên sử dụng 302 hoặc 307 thay thế.
nickgrim

2

Bạn có thể thêm ServerAlias example.comvào VirtualHostnhưng hiệu suất sẽ khác với chuyển hướng.

Biên tập

Vì bạn muốn chuyển hướng và bạn không cần chức năng nâng cao, có vẻ như việc sử dụng Redirectsẽ đủ cho bạn. Bạn sẽ đặt Redirecttheo chỉ thị Virtualhost.

Một giải pháp phía khách hàng sẽ là sử dụng một meta refreshthẻ.


Bạn có thể giải thích thêm một chút? Làm thế nào tôi có thể chuyển hướng www.example.comđể example.comsử dụng phương pháp này?
DisgruntledGoat

Trong vhost chính của bạn, bạn có các mục cho cả hai ServerNameServerAlias. Một cái có example.com và cái kia www.example.com. Sau đó, cả hai mục dns sẽ truy cập vào các tài liệu được chỉ định trong cùng một vhost.
Warner

Tôi muốn làm một chuyển hướng mặc dù, không chỉ là một bí danh.
DisgruntledGoat

Sau đó, khuyến nghị của joshchi có thể là một cách tiếp cận tốt cho bạn. Có vẻ như những sợi lông đang bị chẻ đôi vào thời điểm này.
Warner

1

tốt, bạn có thể tạo một máy chủ ảo cho SERVERNAME www.example.com và chuyển hướng nó đến một máy chủ ảo khác với tên máy chủ example.com

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.