Apache Varsayılan / Catch-Tüm Sanal Konak?


67

3 etki alanım varsa, domain1.com, domain2.com ve domain3.com, listelenmemiş etki alanlarına varsayılan bir sanal ana bilgisayar kurmak mümkün müdür? Örneğin, eğer yapsaydım:

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

Bir etki alanı kaydettirir ve sunucuma yönlendirirseniz, varsayılan olarak domain3 ile aynı olan her şeyi gösterir. Mümkün mü?

Yanıtlar:


45

Evet, ServerAlias ​​asıl ana bilgisayar adına ayarlanmış şekilde ServerAlias ​​"*" olması dışında çalışmalıdır. VirtualHost'un son yüklenen olduğundan emin olmanız gerekebilir ...


İşe yaramalı, ama işe yaramadı. Bir etki alanı özel olarak listelenmemişse, "Firefox sunucuyu bulamıyor."
SJaguar13

2
Bunu "ServerName host" ve "ServerAlias ​​*" olarak ayarladınız mı? Aslında bunu yeterince vurgulamamıştım, ancak ServerName joker karakterler almıyor, yalnızca ServerAlias ​​kullanıyor. SunucuAdı gerçek bir ana bilgisayar adı olmalı.
freiheit

Ayrıca, diğer sanal bilgisayarlar çalışıyor mu? Apache'nin hangi sürümü?
freiheit

"Firefox sunucuyu bulamıyor." apache sorunu değil. Daha fazla detaya ihtiyacınız var (varsa hangi sunucuyla iletişim
kurulursa

Benim için işe yaramaz bir garip, ana bilgisayar başlığından bağımsız olarak her zaman ilk sanal ana bilgisayarı seçer
jjxtra

80

İsme dayalı sanal konakları kullanırken, yüklenen ilk sanal konak yapılandırması varsayılan olacaktır (Kaynak: Apache Wiki ). Örneğin, aşağıdaki yapılandırma ile, aksi halde eşleşmeyen alanlar 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>

Çoğu sunucu yekpare bir yapılandırma dosyasına sahip değildir, ancak aşağıdaki gibi düzenlenmiş birkaç ana bilgisayara özel yapılandırma dosyasına sahiptir:

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

Bu durumda, önce belirli bir sanal ana bilgisayar yapılandırması yükü yapmak için, sembolik bağlantıyı, sıralandığında ilk önce olacak olan gibi yeniden adlandırın 00-default.


Diğer cevapların bazıları pek doğru değil. Apache Wiki’ye göre, sanal bir ana bilgisayarda bir ayar yapmamakServerName yanlıştır. Eğer a olmayan ana bilgisayar ServerNameilk önce yüklenmemişse, Apache hiçbir zaman kullanmayabilir, çünkü ilk yüklenen ana bilgisayar varsayılan olacaktır.

Ayrıca, bir ServerAlias *şeyle eşleşecek olsa da, daha sonra tanımlanan diğer sanal konakları geçersiz kılabilir. Belki de bu yaklaşım, her zaman (sorulan konfigürasyonda olduğu gibi) tanımlanacak en son sanal ana bilgisayarsa işe yarar , ancak bu , sadece yukarıdaki sırayı değiştirmek yerine yeni bir yönerge eklemek ve sıralama düzenini değiştirmek anlamına gelir .


Size + 1 milyon internets efendim! Varsayılan olması için ilk olması gerekir.
Ryan

Hangisinin önce geldiğini biliyor musunuz, httpd.conf veya conf.d / xyz.conf?
Esa Varemo 16:12

2
"yüklenen ilk sanal ana bilgisayar yapılandırması varsayılan olacak" XAMPP'deki (Windows) yerel SSL alan adlarıyla sorunumu çözdüm. Apache her port için varsayılan olarak ilk vHostu kullanır gibi düzgün teminatsız / güvenli istekleri ikisi için sigara eşleştirilmiş etki işlemek amacıyla 80/443 bağlantı noktaları için 2 açık "varsayılan" yapılandırmaları başında tanımlanmış olmalıdır, böylece görünüyorhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf önce yüklenecek ve conf.d / xyz.conf (ya da muhtemelen conf.d / *) 'ı besleyen bir Include satırına sahip olacaktır. Dahil Et satırından önceki herhangi bir yapılandırma (vhosts dahil) önce işlenecektir; include satırından sonraki herhangi bir şey dahil dosyalardan sonra işlenir.
Dan Pritts

7

Bir sunucu adı belirtmeyin ve bu sizin varsayılan vhost'unuz olur.

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

Ayrıca ana httpd.conf dosyasında bir DocumentRoot belirtmediğinizden emin olun, çünkü bu vhost'lara göre öncelikli olacaktır.


Listelenen ilk sanal ana bilgisayar olarak buna sahibim ve hala "Firefox sunucuyu bulamıyor" alıyorum.
SJaguar13

2
Katılmıyorum. İlk sanal ana bilgisayarımı bir ServerName olmadan ayarlamıştım, ancak bazı sanal ana bilgisayarlarla çakışıyor, ancak diğerleri değil. Bir ServerName ekleyerek bu sorunu çözdüm, ancak sunucumda olmayan rastgele bir etki alanına ayarlıyorum. İlk sanal ana bilgisayar olduğundan, varsayılan olarak kullanılır, ancak yalnızca başka bir SunucuAdı ile eşleşmeyen bir etki alanı kullanıldığında eşleşir.
joshaidan

3

Sipariş önemlidir - başkaları için vhost tanımınızı listenin başına taşıyın.


2

_Default_ sanal sunucusunu kullanın ve ilk önce http://httpd.apache.org/docs/2.2/vhosts/examples.html adresinde belirtildiği şekilde httpd-vhosts.conf dosyasına yerleştirin.

"Her isteği belirtilmemiş herhangi bir IP adresine ve bağlantı noktasına, yani başka bir sanal ana bilgisayar için kullanılmayan bir adres / bağlantı noktası kombinasyonuna yakalamak [...] Varsayılan bir vhost hiçbir zaman bir adrese / bağlantı noktasına gönderilen bir isteği yerine getirmez. isme dayalı vhosts için kullanılır. İstek bilinmeyen veya hiç Host: başlık içermiyorsa, her zaman birincil isme dayalı vhost'tan (yapılandırma dosyasında ilk olarak görünen o adres / portun vhost'u) sunulur. "

Tüm vhost'ları 80 numaralı bağlantı noktasına kilitleyen canlı veya şaşkın httpd-vhosts.conf kod parçacığını:

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

Vhost eşleştirme işleminin ayrıntılı bir açıklamasını burada bulabilirsiniz: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_sadece eşleşmeyen IP'ler için kullanılır , bu nedenle joker karakter vhost (*: 80) olduğunda asla kullanılmaz.
Wirone

2

Joker karakter, site yapılandırma dosyalarınızı içerir:

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

Sitenizi conf dosyalarınızı düzenleyerek sırayla yüklenmelerini sağlayın. Örnek...

01-httpd.conf

02-alan 1-Httpd.conf

03-site2-httpd.conf

vb...

Apache bunları sırasıyla okuyacaktır. Ardından, eşleştirilmemiş sanal ana bilgisayarları yakalamak için her zaman en son yüklenen bir tane oluşturun ve varsayılan bir site yüklemek yerine 404 değerini döndürün.

99-tümünü yakalama-Httpd.conf

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

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

Bağlantı noktalarını httpd'nizin dinlediği bağlantı noktalarıyla değiştirdiğinizden emin olun. Veya belirli arayüzleri dinleyen httpd'niz varsa, bunun yerine her arayüz için bir kontrol listesi eklemeniz gerekir:

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

Bu yardımcı olur umarım. Siteleri, belirttiğim sırayla yüklemek ve eşleşmeyen sanal ana bilgisayarların beklenmedik bir siteyi istemeden yüklemelerini önlemek için kullanıyorum.


1

En iyi çözüm, "1" ile başlayan site yapılandırma dosyasını yeniden adlandırmak, böylece ilk önce yüklenecek ve varsayılan siteniz olacaktır.

Apache2 ilk yüklenen vhost dosyasını varsayılan sayfa olarak yapar.


Varsayılan apache kurulumunda ayrıca 000-defaultbu sebeple sanal konak var.
vp_arth

0

<VirtualHost *:port>İlgilendiğiniz ana bilgisayarlar için ServerName / ServerAlias kullanırken ve belirlerken, ne yapmam gerekiyor?

Durumumda biraz arka plan:

ISS'mden dinamik bir IP adresim var, bu yüzden IP adresim dinamik bir IP adresi kayıt şirketine (benim durumumda noip.org) kayıtlıdır. "Anasistemlerimden" birinin DNS kaydımda, host1.ddns.net 'e işaret eden CNAME olarak myabc.example.com olarak kaydedilmesi gerekiyordu. Ancak host2.ddns.net olduğu gibi bırakıldı. Myabc.example.com ve host1.ddns.net 'in site1’e, host2.ddns.net’in site 2’ye gitmesini ve IP adresimi içeren başka bir şeyin varsayılan değere gitmesini istedim.

İlk conf dosyası okuma yani varsayılan olacaktır 000_def.conf, 001_site1.conf, 002_site2.confile bu sırayla okumak edilecek 000_def.confvarsayılan site olarak. (not: benim durumumda, /etc/apache2/sites-enabledaslında gerçek conf dosyasına dinamik linkler olan bu "dosyalar" var /etc/apache2/sites-available)

SunucuAdı, 001_site1.conf ve 002_site2.conf dosyasında kullanıldığından, 000_def.conf dosyasındaki bir şeye de ayarlanması gerekir.

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