web-dev-qa-db-fra.com

Hôte virtuel Apache par défaut / Catch-All?

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

<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 le pointez sur mon serveur, il afficherait par défaut tout le même comme domaine3. Est-ce possible?

68
SJaguar13

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

45
freiheit

Lorsque vous utilisez des hôtes virtuels basés sur un nom, la première configuration d'hôte virtuel chargée sera la valeur par défaut (Source: Apache Wiki ). Par exemple, avec la configuration ci-dessous, sinon les domaines sans correspondance 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 n'ont pas de fichier de configuration monolithique, mais ont 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 faire d'abord charger une configuration d'hôte virtuel particulier, renommez le lien symbolique en quelque chose qui sera le premier lors du tri, comme 00-default.


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

De plus, tandis que ServerAlias * correspondra en effet à n'importe quoi, il peut également remplacer d'autres hôtes virtuels définis ultérieurement. Peut-être que cette approche fonctionnerait si c'est toujours le dernier hôte virtuel à définir (comme dans la configuration donnée dans la question), mais cela signifie ajouter un nouveau directive et changer l'ordre de tri au lieu de simplement changer l'ordre comme ci-dessus.

83
Jason Blevins

Ne spécifiez pas de nom de serveur, et cela devient votre hôte virtuel par défaut.

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

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

7
Vid Luther

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

3
Ray

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

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

Organisez vos fichiers de configuration de 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 intercepter tous les hôtes virtuels inégalés et retourner 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 les ports sur lesquels votre httpd écoute. Ou si vous avez httpd à l'écoute sur des interfaces spécifiques, vous devrez plutôt ajouter un catchall pour 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 les sites dans l'ordre que je spécifie et empêcher les hôtes virtuels inégalés de charger involontairement un site inattendu.

2
Jason Slobotski

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

"Attraper chaque requête vers n'importe quelle adresse IP et port non spécifié, c'est-à-dire une combinaison adresse/port qui n'est utilisée pour aucun autre hôte virtuel [...] Un vhost par défaut ne sert jamais une requête qui a été envoyée à une adresse/port utilisé pour les vhosts basés sur le nom. Si la demande contenait un en-tête Host: inconnu ou aucun, elle est toujours servie à partir du vhost principal basé sur le nom (le vhost pour cette adresse/port apparaissant en premier dans le fichier de configuration). "

Extrait d'un httpd-vhosts.conf en direct mais obscurci qui bloque 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 webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Une explication détaillée du processus de correspondance vhost peut être trouvée ici: http://httpd.Apache.org/docs/2.2/vhosts/details.html

2
ErikE

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 crée le premier fichier vhost chargé comme page par défaut.

1
xoompa

lors de l'utilisation de <VirtualHost *:port> et en spécifiant ServerName/ServerAlias ​​pour les hôtes qui vous intéressent, c'est ce que je devais faire.

Un peu d'histoire dans ma situation:

J'ai une adresse IP dynamique de mon FAI, donc mon adresse IP est enregistrée dans une société d'enregistrement d'adresse IP dynamique (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 est resté tel quel. Je voulais que myabc.example.com et Host1.ddns.net pour aller sur site1 et Host2.ddns.net pour aller sur le site 2 et toute autre chose, y compris mon adresse IP, pour aller par défaut.

Le premier fichier de conf lu sera la valeur par défaut, c'est-à-dire 000_def.conf, 001_site1.conf, 002_site2.conf sera lu dans cet ordre avec 000_def.conf comme site par défaut. (note: dans mon cas, j'ai ces "fichiers" dans /etc/Apache2/sites-enabled qui sont en fait des liens dynamiques vers le fichier de configuration réel dans /etc/Apache2/sites-available)

Étant 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>
0
alan