Tôi cũng bắt gặp câu hỏi này để tìm kiếm apache2 dự phòng vhost động và câu trả lời của Luc đã giúp tôi rất nhiều trong việc giải quyết vấn đề của mình, nhưng tôi vẫn muốn thể hiện những gì tôi đã làm để đạt được mục tiêu của mình, chủ yếu là vì nó liên quan đến một số công việc phụ và vì tôi nghĩ nó có thể hữu ích cho bất kỳ nhân viên nào trong tương lai ...
Mục tiêu của tôi
- vhosting động cho tất cả các tên miền và tên miền phụ trỏ vào VPS của tôi
foo.com
nên phục vụ cùng một nội dung như www.foo.com
- dự phòng cho các tên miền không xác định với một số loại mặc định
- dự phòng cho các tên miền phụ chưa biết của
foo.com
để www.foo.com
trừ trường hợp www
không có sẵn, dự phòng để mặc định thay vì
DNS
Tôi có một vài tên miền (và tất cả tên miền phụ của chúng) trỏ vào VPS của tôi, ví dụ:
- foo.com
- thanh.com
- foobar.com
Hệ thống tập tin
Tôi có các thư mục sau, tên miền chứa các thư mục có tên của các tên miền phụ có sẵn, thư mục www là bắt buộc, nhưng cấu hình sẽ có thể xử lý tình huống không có. Localhost được sử dụng làm dự phòng mặc định:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Xét nghiệm
Chuyển mục tiêu của tôi thành các trường hợp có thể kiểm chứng:
- foo.com nên được phục vụ từ foo.com/www
- www.foo.com nên được phục vụ từ foo.com/www
- bar.foo.com nên được phục vụ từ foo.com/bar
- foo.foo.com nên được phục vụ từ foo.com/www (foo.com/foo không tồn tại)
- bar.com nên được phục vụ từ localhost (bar.com/www không tồn tại)
- www.bar.com phải được phục vụ từ localhost (bar.com/www không tồn tại)
- foo.bar.com nên được phục vụ từ bar.com/foo
- bar.bar.com phải được phục vụ từ localhost (bar.com/bar không tồn tại)
- foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
- www.foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
- foo.foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
Giải pháp
Điều này sử dụng : mod_rewrite
, mod_proxy_http
và tất nhiên mod_vhost_alias
.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
Cái này hoạt động ra sao? Có ba máy chủ ảo được xác định:
localhost
Localhost phục vụ như một mặc định. Tất cả các yêu cầu không thể giải quyết được phục vụ bởi localhost. Thiết lập một liên kết tượng trưng từ localhost đến bất kỳ tên miền nào của bạn cũng giống như thiết lập trang web đó làm mặc định.
tên miền phụ
Subhost miền v.d đang lấy tất cả các yêu cầu ở dạng *.*.*
. Theo mặc định, tất cả các yêu cầu được phục vụ từ /domain.com/sub
như được xác định bởi VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.
dự phòng:
Đầu tiên RewriteRule
chăm sóc các tên miền không xác định, ví dụ. domain.com
thư mục không tồn tại, bằng cách ủy quyền trang web localhost.
Thứ hai RewriteRule
cũng ủy nhiệm cho localhost khi cả thư mục domain.com/sub
và domain.com/www
thư mục không có mặt.
Các RewriteRule
proxy thứ ba domain.com
khi domain.com/sub
không tồn tại. Chúng tôi biết domain.com/www
có tồn tại vì khối viết lại thứ hai.
Bare.domain
Các vhost Bare.domain đang lấy các *.*
yêu cầu và phục vụ chúng/domain.com/www
Ở đây RewriteRule
sẽ proxy cho localhost khi domain.com
hoặc domain.com/www
không tồn tại.
^ $%. * !!!
Tôi đã có một số rắc rối quấn quanh đầu tôi tất cả những $
và %
những dấu hiệu trong RewriteCond
và RewriteRule
vì vậy tôi sẽ giải thích về họ ở đây:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- Các
*
trong ServerAlias
chỉ là ký tự đại diện.
- Các
%n
trong VirtualDocumentRoot
là từ nội suy tên tài liệu .
- Cái
%n
thứ hai RewriteCond
đề cập đến các lựa chọn (.*)
từ cái thứ nhất RewriteCond
, vd. các phần của miền được yêu cầu.
- Việc
%n
trong RewriteRule
quá.
- Các
$1
trong RewriteRule
đề cập đến việc lựa chọn (.*)
ở đầu RewriteRule
. Mà nắm bắt mọi thứ từ tên miền cho đến ?
trong url yêu cầu. Bất kỳ chuỗi truy vấn được tự động thêm vào url bởi mod_proxy
.