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?
apache-2.2
virtualhost
SJaguar13
fuente
fuente
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
: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:
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
ServerName
en un host virtual es incorrecto. Si el host sin aServerName
no 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.fuente
httpd-vhosts.conf
No especifique un nombre de servidor, y ese se convierte en su vhost predeterminado.
También asegúrese de no haber especificado un DocumentRoot en el archivo httpd.conf principal, ya que tendrá prioridad sobre los vhosts.
fuente
El orden es importante: mueva su definición de vhost para todo lo demás al principio de la lista.
fuente
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:
Puede encontrar una explicación detallada del proceso de coincidencia de vhost aquí: http://httpd.apache.org/docs/2.2/vhosts/details.html
fuente
_default_
se usa solo para IP no coincidentes , por lo que cuando tiene un vhost comodín (*: 80) nunca se usará.El comodín incluye los archivos de configuración de su sitio:
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
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:
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.
fuente
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.
fuente
000-default
host virtual por este motivo.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.conf
será leída en ese orden con000_def.conf
que el sitio predeterminado. (nota: en mi caso, tengo estos "archivos" en los/etc/apache2/sites-enabled
que 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.
fuente