Apache Mặc định / Catch-All Virtual Host?


67

Nếu tôi có 3 tên miền, domain1.com, domain2.com và domain3.com, có thể thiết lập máy chủ ảo mặc định cho các tên miền không được liệt kê không? Ví dụ: nếu tôi có:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Nếu bạn đăng ký một tên miền và trỏ nó đến máy chủ của tôi, nó sẽ mặc định mọi thứ hiển thị giống như domain3. Điều đó có thể không?

Câu trả lời:


45

Có, điều đó sẽ hoạt động, ngoại trừ ServerAlias ​​phải là "*", với Tên máy chủ được đặt thành tên máy chủ thực tế. Bạn có thể cần đảm bảo rằng Virtualhost là lần tải cuối cùng ...


Nó nên hoạt động, nhưng không. Nếu một tên miền không được liệt kê cụ thể, tôi nhận được "Firefox không thể tìm thấy máy chủ."
SJaguar13

2
Bạn đã đặt nó là "Máy chủ tên máy chủ" và "ServerAlias ​​*" chưa? Tôi đã không nhấn mạnh điều này đủ ban đầu, nhưng ServerName không lấy ký tự đại diện, chỉ có ServerAlias. Tên máy chủ cần phải là một tên máy chủ thực tế.
freiheit

Ngoài ra, các virtualhost khác có hoạt động không? Phiên bản nào của apache?
freiheit

"Firefox không thể tìm thấy máy chủ." không phải là một vấn đề apache. Bạn cần biết thêm chi tiết (máy chủ nào nếu có liên hệ, mã lỗi là gì ...)
Law29

Thật kỳ lạ, nó không hoạt động với tôi, nó luôn chọn virtualhost đầu tiên bất kể tiêu đề máy chủ
jjxtra

80

Khi sử dụng máy chủ ảo dựa trên tên, cấu hình máy chủ ảo đầu tiên được tải sẽ là mặc định (Nguồn: Apache Wiki ). Ví dụ: với cấu hình bên dưới, các tên miền chưa từng có sẽ khớp với domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Nhiều máy chủ không có tệp cấu hình nguyên khối, nhưng có một số tệp cấu hình dành riêng cho máy chủ được tổ chức như sau:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

Trong trường hợp này, để thực hiện tải cấu hình máy chủ ảo cụ thể trước tiên, hãy đổi tên liên kết tượng trưng thành thứ gì đó sẽ là đầu tiên khi được sắp xếp, chẳng hạn như 00-default.


Một số câu trả lời khác không hoàn toàn chính xác. Theo Wiki Wiki, không đặt ServerNamemáy chủ ảo là không chính xác. Nếu máy chủ không có ServerNametải không được tải trước, Apache thậm chí có thể không bao giờ sử dụng nó, vì máy chủ đầu tiên được tải sẽ là mặc định.

Hơn nữa, trong khi ServerAlias *thực sự sẽ phù hợp với bất cứ điều gì, nó cũng có thể ghi đè các máy chủ ảo khác được xác định sau. Có thể cách tiếp cận này sẽ hoạt động nếu nó luôn là máy chủ ảo cuối cùng được xác định (như trong cấu hình được đưa ra trong câu hỏi), nhưng điều này có nghĩa là thêm một lệnh mới thay đổi thứ tự sắp xếp thay vì chỉ thay đổi thứ tự như trên.


+ 1 triệu internets cho bạn! Nó phải là đầu tiên để được mặc định.
Ryan

Bạn có biết cái nào đến trước, httpd.conf hoặc conf.d / xyz.conf không?
Esa Varemo

2
"cấu hình máy chủ ảo đầu tiên được tải sẽ là mặc định" đã giải quyết vấn đề của tôi với các miền SSL cục bộ trên XAMPP (Windows). Có vẻ như Apache sử dụng vhost đầu tiên làm mặc định cho mỗi cổng, do đó, để xử lý chính xác các miền không khớp cho cả hai yêu cầu không được bảo mật / bảo mật, cần có 2 cấu hình "mặc định" rõ ràng cho 80/443 cổng được xác định ở đầuhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf sẽ được tải trước tiên và nó sẽ có một dòng Bao gồm nguồn conf.d / xyz.conf (hoặc có thể, conf.d / *). mọi cấu hình (bao gồm cả vhost) trước dòng Bao gồm sẽ được xử lý trước; mọi thứ sau dòng bao gồm được xử lý sau các tệp được bao gồm.
Dan Pritts 1/5/2015

7

Không chỉ định tên máy chủ và đó sẽ trở thành vhost mặc định của bạn ..

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Ngoài ra, hãy chắc chắn rằng bạn chưa chỉ định DocumentRoot trong tệp httpd.conf chính, vì điều đó sẽ được ưu tiên hơn các vhost.


Tôi có cái đó là máy chủ ảo đầu tiên được liệt kê và tôi vẫn nhận được "Firefox không thể tìm thấy máy chủ."
SJaguar13

2
Tôi không đồng ý. Tôi đã thiết lập máy chủ ảo đầu tiên của mình mà không có ServerName, tuy nhiên, nó dường như mâu thuẫn với một số máy chủ ảo, nhưng không phải là các máy chủ ảo khác. Tôi đã giải quyết vấn đề bằng cách thêm ServerName, nhưng đặt nó thành một số miền ngẫu nhiên không có trên máy chủ của tôi. Vì là máy chủ ảo đầu tiên, nó được sử dụng làm mặc định, nhưng chỉ khớp khi tên miền không khớp với bất kỳ Tên máy chủ nào khác được sử dụng.
joshaidan

3

Thứ tự là quan trọng - di chuyển định nghĩa vhost của bạn cho mọi thứ khác vào đầu danh sách.


2

Sử dụng máy chủ ảo _default_ và đặt nó đầu tiên trong httpd-vhosts.conf như được chỉ định trong http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Nắm bắt mọi yêu cầu đối với bất kỳ địa chỉ IP và cổng không xác định nào, nghĩa là kết hợp địa chỉ / cổng không được sử dụng cho bất kỳ máy chủ ảo nào khác [...] Một vhost mặc định không bao giờ phục vụ yêu cầu được gửi đến địa chỉ / cổng đó là được sử dụng cho các vhost dựa trên tên. Nếu yêu cầu chứa tiêu đề không xác định hoặc không có Host: nó luôn được phục vụ từ vhost dựa trên tên chính (vhost cho địa chỉ / cổng đó xuất hiện đầu tiên trong tệp cấu hình). "

Đoạn trích từ một httpd-vhosts.conf trực tiếp nhưng bị xáo trộn, điều này xảy ra để khóa tất cả các vhost vào cổng 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Có thể tìm thấy giải thích sâu về quy trình khớp vhost tại đây: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_chỉ được sử dụng cho các IP không khớp , vì vậy khi bạn có vhost ký tự đại diện (*: 80) thì nó sẽ không bao giờ được sử dụng.
Wirone

2

Wildcard bao gồm các tệp cấu hình trang web của bạn:

Include path/to/site/confs/*httpd.conf

Sắp xếp các tập tin conf trang web của bạn để chúng được tải theo thứ tự dự kiến. Thí dụ...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

Vân vân...

Apache sẽ đọc chúng theo thứ tự. Sau đó, tạo một cái sẽ luôn tải lần cuối để bắt bất kỳ máy chủ ảo chưa từng có nào và trả về 404 thay vì tải một trang mặc định.

99-Catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Hãy chắc chắn thay thế các cổng bằng bất kỳ cổng nào mà httpd của bạn lắng nghe. Hoặc nếu bạn có httpd lắng nghe trên các giao diện cụ thể, bạn sẽ cần thêm một mục thu hút cho từng giao diện, như vậy:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Hi vọng điêu nay co ich. Tôi sử dụng phương pháp này để tải các trang web theo thứ tự tôi chỉ định và ngăn chặn các máy chủ ảo chưa từng có tải một trang web không mong muốn ngoài ý muốn.


1

Giải pháp tốt nhất là đổi tên tệp cấu hình trang bắt đầu bằng "1" để tệp sẽ tải trước và đó sẽ là trang mặc định của bạn.

Apache2 tạo tệp vhost được tải đầu tiên làm trang mặc định.


cài đặt apache mặc định cũng có 000-defaultmáy chủ ảo vì lý do này.
vp_arth

0

khi sử dụng <VirtualHost *:port>và chỉ định ServerName / ServerAlias ​​cho các máy chủ bạn quan tâm, đó là điều tôi cần làm.

Một chút nền tảng trong tình huống của tôi:

Tôi có một địa chỉ IP động từ ISP của tôi để địa chỉ IP của tôi được đăng ký tại một công ty đăng ký địa chỉ IP động (noip.org trong trường hợp của tôi). Một trong những "máy chủ" của tôi cần được đăng ký tại đăng ký DNS của tôi là myabc.example.com dưới dạng CNAME, trỏ đến host1.ddns.net. Nhưng host2.ddns.net vẫn như cũ. Tôi muốn myabc.example.com và host1.ddns.net truy cập trang web1 và host2.ddns.net để truy cập trang web 2 và mọi thứ khác bao gồm địa chỉ IP của tôi để đi đến mặc định.

Là người đầu tiên đọc file conf sẽ là mặc định, tức là 000_def.conf, 001_site1.conf, 002_site2.confsẽ được đọc theo thứ tự mà có 000_def.confnhư các trang web mặc định. (lưu ý: trong trường hợp của tôi, tôi có các "tệp" này trong /etc/apache2/sites-enabledđó thực sự là các liên kết động đến tệp conf thực tế trong /etc/apache2/sites-available)

Vì ServerName đang được sử dụng trong 001_site1.conf và 002_site2.conf, nên nó cũng phải được đặt thành một cái gì đó trong 000_def.conf.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
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.