Apache Virtual predeterminado / Catch-All Host virtual?

67

Si tengo 3 dominios, dominio1.com, dominio2.com y dominio3.com, ¿es posible configurar un host virtual predeterminado para dominios que no figuran en la lista? Por ejemplo, si tuviera:

<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 registra un dominio y lo apunta a mi servidor, el valor predeterminado será todo lo que muestre lo mismo que dominio3. ¿Es eso posible?

SJaguar13
fuente

Respuestas:

45

Sí, eso debería funcionar, excepto que ServerAlias ​​debería ser "*", con ServerName establecido en un nombre de host real. Es posible que deba asegurarse de que VirtualHost sea el último cargado ...

freiheit
fuente
Debería funcionar, pero no funciona. Si un dominio no figura específicamente en la lista, aparece "Firefox no puede encontrar el servidor".
SJaguar13
2
¿Lo configuró como "Host ServerName" y "ServerAlias ​​*"? Originalmente no enfaticé esto lo suficiente, pero ServerName no toma comodines, solo ServerAlias ​​sí. ServerName debe ser un nombre de host real.
Freiheit
Además, ¿funcionan los otros hosts virtuales? ¿Qué versión de apache?
Freiheit
"Firefox no puede encontrar el servidor". No es un problema de Apache. Necesita más detalles (qué servidor se contacta, cuál es el código de error ...)
Ley
Extraño que no funciona para mí, siempre elige el primer virtualhost independientemente del encabezado del host
jjxtra
80

Al usar hosts virtuales basados ​​en nombres, la primera configuración de host virtual cargada será la predeterminada (Fuente: Apache Wiki ). Por ejemplo, con la configuración a continuación, de lo contrario, los dominios no coincidentes coincidirán con 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>

Muchos servidores no tienen un archivo de configuración monolítico, pero tienen varios archivos de configuración específicos del host organizados de la siguiente manera:

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

En este caso, para hacer que una configuración particular de host virtual se cargue primero, cambie el nombre del enlace simbólico a algo que será primero cuando se ordene, como 00-default.


Algunas de las otras respuestas no son del todo correctas. Según el Wiki de Apache, no establecer un ServerNameen un host virtual es incorrecto. Si el host sin a ServerNameno se carga primero, Apache nunca puede usarlo, ya que el primer host cargado sería el predeterminado.

Además, si bien ServerAlias *coincidirá con cualquier cosa, también puede anular otros hosts virtuales definidos más adelante. Tal vez este enfoque funcionaría si siempre es el último host virtual que se definió (como en la configuración dada en la pregunta), pero esto significa agregar una nueva directiva y cambiar el orden de clasificación en lugar de simplemente cambiar el orden como se indicó anteriormente.

Jason Blevins
fuente
¡Más de 1 millón de Internet para usted, señor! Tiene que ser el primero en ser predeterminado.
Ryan
¿Sabes cuál es primero, httpd.conf o conf.d / xyz.conf?
Esa Varemo
2
"la primera configuración de host virtual cargada será la predeterminada" resolvió mi problema con los dominios SSL locales en XAMPP (Windows). Parece que Apache usa el primer vhost como valores predeterminados para cada puerto, por lo que para manejar adecuadamente los dominios no coincidentes para las solicitudes no seguras / seguras, debe haber 2 configuraciones "predeterminadas" explícitas para los puertos 80/443 definidos al comienzo dehttpd-vhosts.conf
Wirone
1
@EsaVaremo: httpd.conf se cargará primero y tendrá una línea de inclusión que genera conf.d / xyz.conf (o probablemente conf.d / *). cualquier configuración (incluidos vhosts) antes de la línea Incluir se procesará primero; cualquier cosa después de la línea de inclusión se procesa después de los archivos incluidos.
Dan Pritts
7

No especifique un nombre de servidor, y ese se convierte en su vhost predeterminado.

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

También asegúrese de no haber especificado un DocumentRoot en el archivo httpd.conf principal, ya que tendrá prioridad sobre los vhosts.

Vid Luther
fuente
Lo tengo como el primer host virtual de la lista, y aún aparece "Firefox no puede encontrar el servidor".
SJaguar13
2
Estoy en desacuerdo. Tuve mi primer host virtual configurado sin ServerName, sin embargo, parece estar en conflicto con algunos hosts virtuales, pero no con otros. Resolví el problema agregando un ServerName, pero configurándolo en un dominio aleatorio que no está en mi servidor. Como es el primer host virtual, se usa como predeterminado, pero solo coincide cuando se usa un dominio que no coincide con ningún otro ServerName.
joshaidan
3

El orden es importante: mueva su definición de vhost para todo lo demás al principio de la lista.


fuente
2

Use el host virtual _default_ y colóquelo primero en httpd-vhosts.conf como se especifica en http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Capturar cada solicitud a cualquier dirección IP y puerto no especificados, es decir, una combinación de dirección / puerto que no se utiliza para ningún otro host virtual [...] Un vhost predeterminado nunca atiende una solicitud que se envió a una dirección / puerto que es se utiliza para vhosts basados ​​en nombres. Si la solicitud contenía un host desconocido o ningún encabezado: siempre se sirve desde el vhost primario basado en el nombre (el vhost para esa dirección / puerto aparece primero en el archivo de configuración) ".

Fragmento de un httpd-vhosts.conf vivo pero ofuscado que bloquea todos los vhosts en el puerto 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...

Puede encontrar una explicación detallada del proceso de coincidencia de vhost aquí: http://httpd.apache.org/docs/2.2/vhosts/details.html

ErikE
fuente
2
_default_se usa solo para IP no coincidentes , por lo que cuando tiene un vhost comodín (*: 80) nunca se usará.
Wirone
2

El comodín incluye los archivos de configuración de su sitio:

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

Organice los archivos conf de su sitio para que se carguen en el orden esperado. Ejemplo...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

etc ...

Apache los leerá en orden. Luego, cree uno que siempre se cargue en último lugar para capturar los hosts virtuales no coincidentes y devolver un 404 en lugar de cargar un sitio predeterminado.

99-catchall-httpd.conf

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

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

Asegúrese de reemplazar los puertos con los puertos que escuche su httpd. O si tiene httpd escuchando en interfaces específicas, deberá agregar un catchall para cada interfaz, de esta manera:

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

Espero que esto ayude. Utilizo este método para cargar sitios en el orden que especifico y evito que los hosts virtuales no coincidentes carguen un sitio inesperado sin querer.

Jason Slobotski
fuente
1

La mejor solución es cambiar el nombre del archivo de configuración del sitio comenzando con un "1" para que se cargue primero y ese será su sitio predeterminado.

Apache2 crea el primer archivo vhost cargado como la página predeterminada.

xoompa
fuente
la instalación predeterminada de apache también tiene 000-defaulthost virtual por este motivo.
vp_arth
0

al usar <VirtualHost *:port>y especificar ServerName / ServerAlias ​​para los hosts que le interesan, que es lo que necesitaba hacer.

Un poco de historia en mi situación:

Tengo una dirección IP dinámica de mi ISP, por lo que mi dirección IP está registrada en una empresa de registro de direcciones IP dinámicas (noip.org en mi caso). Uno de mis "hosts" necesitaba estar registrado en mi registro DNS como myabc.example.com como un CNAME que apunta a host1.ddns.net. Pero host2.ddns.net se dejó como está. Quería myabc.example.com y host1.ddns.net para ir al sitio1 y host2.ddns.net para ir al sitio 2 y cualquier otra cosa, incluida mi dirección IP, a los valores predeterminados.

La primera lectura de archivos conf será la predeterminada, es decir 000_def.conf, 001_site1.conf, 002_site2.confserá leída en ese orden con 000_def.confque el sitio predeterminado. (nota: en mi caso, tengo estos "archivos" en los /etc/apache2/sites-enabledque en realidad hay enlaces dinámicos al archivo conf real /etc/apache2/sites-available)

Debido a que ServerName se está utilizando en 001_site1.conf y 002_site2.conf, también debe establecerse en algo en 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
fuente