Hôte virtuel Apache Default / Catch-All?

67

Si j'ai 3 domaines, domain1.com, domain2.com et domain3.com, est-il possible de configurer un hôte virtuel par défaut pour des domaines non répertoriés? Par exemple, si j'avais:

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

Si vous enregistrez un domaine et que vous le dirigez vers mon serveur, il affichera par défaut la même chose que domain3. Est-ce possible?

SJaguar13
la source

Réponses:

45

Oui, cela devrait fonctionner, sauf que ServerAlias ​​devrait être "*", avec ServerName défini sur un nom d'hôte réel. Vous devrez peut-être vous assurer que VirtualHost est le dernier chargé ...

freiheit
la source
Cela devrait marcher, mais ça ne marche pas. Si un domaine n'est pas spécifiquement répertorié, j'obtiens "Firefox ne peut pas trouver le serveur".
SJaguar13
2
L'avez-vous défini comme "hôte ServerName" et "ServerAlias ​​*"? À l'origine, je n'insistais pas assez sur ce point, mais ServerName ne prend pas de caractères génériques, seul ServerAlias ​​le fait. ServerName doit être un nom d'hôte réel.
Freiheit
De plus, les autres hôtes virtuels fonctionnent-ils? Quelle version d'apache?
Freiheit
"Firefox ne trouve pas le serveur." n'est pas un problème d'apache. Vous avez besoin de plus de détails (quel serveur, le cas échéant, est contacté, quel est le code d'erreur ...)
Law29
Bizarre, cela ne fonctionne pas pour moi, il choisit toujours le premier virtualhost, quel que soit l'en-tête de l'hôte
jjxtra
80

Lorsque vous utilisez des hôtes virtuels nommés, la première configuration d’hôte virtuel chargée sera la configuration par défaut (Source: Apache Wiki ). Par exemple, avec la configuration ci-dessous, sinon les domaines non appariés correspondront à 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>

De nombreux serveurs ne possèdent pas de fichier de configuration monolithique, mais plusieurs fichiers de configuration spécifiques à l'hôte, organisés comme suit:

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

Dans ce cas, pour charger en premier une configuration particulière de l'hôte virtuel, renommez le lien symbolique en quelque chose qui sera premier lorsqu'il sera trié, tel que 00-default.


Certaines des autres réponses ne sont pas tout à fait correctes. Selon le wiki Apache, ne pas définir un ServerNamehôte virtuel est incorrect. Si l'hôte sans a ServerNamen'est pas chargé en premier, Apache pourrait même ne jamais l'utiliser, car le premier hôte chargé serait celui par défaut.

En outre, ServerAlias *bien qu’il corresponde à tout, il peut également remplacer d’autres hôtes virtuels définis ultérieurement. Peut-être que cette approche fonctionnerait si c'était toujours le dernier hôte virtuel à être défini (comme dans la configuration donnée dans la question), mais cela impliquerait d'ajouter une nouvelle directive et de changer l'ordre de tri au lieu de changer simplement l'ordre comme ci-dessus.

Jason Blevins
la source
+ 1 million d'internets à vous Monsieur! Ce doit être le premier à être par défaut.
Ryan
Savez-vous lequel vient en premier, httpd.conf ou conf.d / xyz.conf?
Esa Varemo
2
"La première configuration d'hôte virtuel chargée sera celle par défaut" a résolu mon problème avec les domaines SSL locaux sur XAMPP (Windows). Il semble qu'Apache utilise d'abord vhost comme valeurs par défaut pour chaque port. Par conséquent, pour gérer correctement les domaines non appariés pour les demandes non sécurisées / sécurisées, il doit exister 2 configurations "par défaut" explicites pour les ports 80/443 définies au début dehttpd-vhosts.conf
Wirone
1
@EsaVaremo - httpd.conf sera chargé en premier et comportera une ligne Include indiquant les sources conf.d / xyz.conf (ou vraisemblablement, conf.d / *). toute configuration (y compris vhosts) avant la ligne d'inclusion sera traitée en premier; tout ce qui se passe après la ligne d'inclusion est traité après les fichiers inclus.
Dan Pritts
7

Ne spécifiez pas un nom de serveur, et cela deviendra votre vhost par défaut.

<VirtualHost *:80>
ServerAdmin [email protected]

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> 

Assurez-vous également que vous n'avez pas spécifié DocumentRoot dans le fichier principal httpd.conf, car cela aura priorité sur les hôtes virtuels.

Vid Luther
la source
En tant que premier hôte virtuel, je l’ai répertorié et j’obtiens toujours «Firefox ne peut pas trouver le serveur».
SJaguar13
2
Je ne suis pas d'accord. J'avais mon premier hôte virtuel configuré sans ServerName, cependant, il semble entrer en conflit avec certains hôtes virtuels, mais pas avec d'autres. J'ai résolu le problème en ajoutant un nom de serveur, mais en le définissant sur un domaine aléatoire ne se trouvant pas sur mon serveur. Comme il s'agit du premier hôte virtuel, il est utilisé par défaut, mais ne correspond que lorsqu'un domaine ne correspondant à aucun autre nom de serveur est utilisé.
joshaidan
3

L'ordre est important - déplacez votre définition vhost pour tout le reste en tête de liste.


la source
2

Utilisez l'hôte virtuel _default_ et placez-le d'abord dans httpd-vhosts.conf, comme indiqué dans http://httpd.apache.org/docs/2.2/vhosts/examples.html.

"Catching chaque demande à n'importe quelle adresse IP et port non spécifiés, c.-à-d., Une combinaison adresse / port qui n'est pas utilisée pour tout autre hôte virtuel [...] Un hôte par défaut ne sert jamais une demande qui a été envoyée à une adresse / port qui est utilisé pour les hôtes virtuels basés sur le nom. Si la demande contient un en-tête Host: inconnu ou inexistant, elle est toujours servie à partir de l'hôte virtuel basé sur le nom (l'hôte virtuel de cette adresse / de ce port apparaissant en premier dans le fichier de configuration). "

Extrait d'un httpd-vhosts.conf en direct mais obfusqué qui verrouille tous les vhosts sur le port 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 [email protected]
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Vous trouverez une explication détaillée du processus de correspondance vhost à l’ adresse suivante : http://httpd.apache.org/docs/2.2/vhosts/details.html

ErikE
la source
2
_default_est utilisé uniquement pour les adresses IP qui ne correspondent pas . Ainsi, lorsque vhost est un caractère générique (*: 80), il ne sera jamais utilisé.
Wirone
2

Les caractères génériques incluent les fichiers de configuration de votre site:

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

Organisez les fichiers de configuration de votre site afin qu'ils soient chargés dans un ordre attendu. Exemple...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

etc...

Apache les lira dans l'ordre. Ensuite, créez-en un qui se chargera toujours en dernier pour capturer tous les hôtes virtuels sans correspondance et renverra un 404 au lieu de charger un site par défaut.

99-catchall-httpd.conf

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

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

Assurez-vous de remplacer les ports par ceux que votre httpd écoute. Ou si vous avez httpd à l'écoute sur des interfaces spécifiques, vous devrez plutôt ajouter un fourre-tout à chaque interface, comme ceci:

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

J'espère que cela t'aides. J'utilise cette méthode pour charger des sites dans l'ordre spécifié et empêcher que des hôtes virtuels sans correspondance ne chargent par inadvertance un site inattendu.

Jason Slobotski
la source
1

La meilleure solution consiste à renommer le fichier de configuration du site en commençant par "1" afin qu'il se charge en premier et qu'il s'agisse de votre site par défaut.

Apache2 fait du premier fichier vhost chargé la page par défaut.

Xoompa
la source
L'installation par défaut d'Apache a également 000-defaultun hôte virtuel pour cette raison.
vp_arth
0

lorsque vous utilisez <VirtualHost *:port>et spécifiez ServerName / ServerAlias ​​pour les hôtes qui vous intéressent, c’est ce que je devais faire.

Un peu de contexte dans ma situation:

J'ai une adresse IP dynamique de mon fournisseur de services Internet; mon adresse IP est donc enregistrée auprès d'une société d'enregistrement d'adresses IP dynamiques (noip.org dans mon cas). Un de mes "hôtes" devait être enregistré lors de mon enregistrement DNS en tant que myabc.example.com en tant que CNAME qui pointe vers host1.ddns.net. Mais host2.ddns.net a été laissé tel quel. Je voulais que myabc.example.com et host1.ddns.net se rendent sur site1 et host2.ddns.net sur le site 2 et que tout le reste, y compris mon adresse IP, passe par défaut.

La première lecture de fichier de configuration sera la valeur par défaut, à savoir 000_def.conf, 001_site1.conf, 002_site2.confsera lu dans cet ordre avec 000_def.confcomme site par défaut. (note: dans mon cas, j'ai ces "fichiers" dans /etc/apache2/sites-enabledlesquels se trouvent des liens dynamiques vers le fichier de conf en /etc/apache2/sites-available)

Etant donné que ServerName est utilisé dans 001_site1.conf et 002_site2.conf, il doit également être défini sur quelque chose dans 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>
Alan
la source