73 votes

Apache Default/Catch-All Virtual Host ?

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 les domaines non répertoriés ? Par exemple, si j'ai :

<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 faites pointer vers mon serveur, tout le reste affichera par défaut la même chose que le domaine 3. Cela est-il possible ?

98voto

Jason Blevins Points 1161

Lorsque vous utilisez des hôtes virtuels basés sur le nom, le premier hôte virtuel chargée sera la configuration par défaut (Source : Apache Wiki ). Par exemple, avec la configuration ci-dessous, les domaines qui ne seraient pas appariés autrement 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 disposent pas d'un fichier de configuration monolithique, mais ont des fichiers 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 en sorte qu'une configuration d'hôte virtuel particulière charge particulière, renommez le lien symbolique en quelque chose qui sera le premier trié, comme 00-default .


Certaines des autres réponses ne sont pas tout à fait correctes. Selon l'étude Wiki Apache, ne pas fixer un ServerName dans un hôte virtuel est incorrect. Si l'hôte sans ServerName n'est pas chargé en premier, Apache pourrait ne jamais l'utiliser, puisque le premier hôte chargé serait par défaut.

En outre, alors 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 l'hôte virtuel à définir (comme dans la configuration donnée dans la question), mais cela implique d'ajouter une nouvelle et changer l'ordre de tri au lieu de simplement changer le l'ordre comme ci-dessus.

3 votes

+ 1 million d'internets à vous Monsieur ! Il faut être le premier pour être par défaut.

0 votes

Savez-vous lequel vient en premier, httpd.conf ou conf.d/xyz.conf ?

2 votes

"la première configuration d'hôte virtuel chargée sera la configuration par défaut" a résolu mon problème avec les domaines SSL locaux sur XAMPP (Windows). Il semble qu'Apache utilise la première configuration d'hôte virtuel par défaut pour chaque port, donc afin de gérer correctement les domaines non appariés pour les requêtes non sécurisées/sécurisées, il devrait y avoir 2 configurations explicites "par défaut" pour les ports 80/443 définies au début du fichier httpd-vhosts.conf

47voto

freiheit Points 14144

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 tout dernier élément chargé...

0 votes

Cela devrait fonctionner, mais ce n'est pas le cas. Si un domaine n'est pas spécifiquement listé, j'obtiens "Firefox ne peut pas trouver le serveur".

2 votes

Avez-vous défini "ServerName host" et "ServerAlias *" ? Je n'ai pas assez insisté sur ce point à l'origine, mais ServerName ne prend pas les caractères génériques, seul ServerAlias le fait. ServerName doit être un nom d'hôte réel.

0 votes

Les autres serveurs virtuels fonctionnent-ils ? Quelle version d'apache ?

7voto

user19616 Points 67

Si vous ne spécifiez pas de nom de serveur, celui-ci deviendra votre serveur 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 principal httpd.conf, car il aura la priorité sur les vhosts.

0 votes

J'en ai fait le premier hôte virtuel listé, et j'obtiens toujours le message "Firefox ne trouve pas le serveur".

2 votes

Je ne suis pas d'accord. J'ai configuré mon premier hôte virtuel sans nom de serveur, mais il semble qu'il y ait un conflit avec certains hôtes virtuels, mais pas avec d'autres. J'ai résolu le problème en ajoutant un ServerName, mais en le définissant sur un domaine aléatoire qui n'est 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 ServerName est utilisé.

2voto

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

2voto

ErikE Points 4616

Utilisez l'hôte virtuel _par défaut_ et placez-le en premier dans httpd-vhosts.conf comme spécifié dans http://httpd.apache.org/docs/2.2/vhosts/examples.html

"La prise en charge de toute requête vers une adresse IP et un port non spécifiés, c'est-à-dire une combinaison adresse/port qui n'est pas utilisée pour un autre hôte virtuel [...] Un serveur virtuel par défaut ne prend jamais en charge une requête envoyée à une adresse/un port utilisé pour les serveurs virtuels par nom. Si la requête contient un en-tête Host : inconnu ou inexistant, elle est toujours servie par le serveur virtuel primaire par nom (le serveur virtuel pour cette adresse/ce port apparaissant en premier dans le fichier de configuration)."

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

# more vhosts etc...

Une explication approfondie du processus de mise en correspondance des serveurs virtuels est disponible ici : http://httpd.apache.org/docs/2.2/vhosts/details.html

3 votes

_default_ n'est utilisé que pour les IPs Ainsi, lorsque vous avez un serveur virtuel avec joker (*:80), il ne sera jamais utilisé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X