Manejo predeterminado para dominios / subdominios no coincidentes en Apache

12

Tengo una configuración de Apache2 con múltiples VirtualHosts. Mi DNS está configurado para aceptar *.<domain>.<tld>en múltiples dominios. Todo funciona correctamente, pero si voy something-random-here.example.com, parece que se está seleccionando un VirtualHost no válido (supongo que el primero o el último que encuentre). ¿Hay alguna manera de decirle a Apache que use ciertas reglas si ninguna de las entradas de VirtualHost coincide con el dominio o subdominio? Preferiblemente me gustaría devolver un 404.

Ryall
fuente

Respuestas:

12

Apache usa el primer virtualhost si ningún nombre coincide. Simplemente configure un nuevo host virtual como el primero con un nombre aleatorio, mostrando lo que quiera, o devolviendo una página 404.

Moritz Ambos
fuente
Gracias pero ¿podrías por favor dar más detalles? No puedo hacer que esto funcione.
Ryall
2
¿Cómo se distribuyen los archivos de configuración de apache2? ¿O qué sistema operativo utilizas? Apache lee la configuración en un cierto orden, y el primer VirtualHost que ve es el predeterminado. Recibe todo el tráfico de nombres de host desconocidos. Entonces, si tiene un solo archivo de configuración, el primer VirtualHost es él. Si tiene varios, como en la mayoría de los linuxes, puede ser el llamado 0default o algo así ...
Moritz Ambos
Puse algunas configuraciones predeterminadas en el ports.conf. No funcionaba porque intenté hacer coincidir *: 80 cuando estaba usando <ip>: 80 en mis hosts virtuales. En cambio, tuve que crear una entrada predeterminada por separado para cada IP y ahora funciona.
Ryall
No se utiliza ni mi primer ni el último archivo v-host. Creo que apache ha cambiado.
Cobolt
4

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 cualquier puerto en el 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
¿No se debe eliminar "ServerAlias ​​*" de las reglas generales?
Ahm3d dijo el
Supongo que no importaría. Si ninguno de los hosts virtuales anteriores a la captura general maneja la solicitud, estos devolverán una respuesta 404. No veo una razón por la que ServerAlias ​​* deba eliminarse, pero pueden ser innecesariamente específicos.
Jason Slobotski el
0

Como se Moritz Bothmenciona, Apache2 utilizará el primer host virtual que encuentre si no coincide con ninguno de los que ha solicitado.

Cuando instala Apache2 por primera vez, hay un sitio web predeterminado que puede usar como plantilla, modificar o eliminar, y siempre me preguntaba para qué era realmente 000-default.conf, porque también tenían un default.conf. Después de leer lo que Moritz Bothdijo, todo tiene más sentido ahora.

Lo que hice para mi servidor fue copiar la configuración para el nombre de host predeterminado (sitio web) en el archivo 000-default.conf y a2ensite 000-default.

Ahora, cada vez que hay una solicitud de dominio sin igual para mi sitio web, sirve la página predeterminada de 000, que es solo una copia de mi página predeterminada real.

Desarrollador Newteq
fuente
1
Hago lo mismo, pero mi host no coincidente / predeterminado envía una redirección al sitio de nivel superior adecuado que también cambia la URL mostrada a la correcta.
ivanivan
¡Esa es una gran idea! No pensé en eso. Definitivamente voy a implementar mi sitio así :)
Newteq Developer
Por alguna razón, parece que no puedo redirigir mi ssl (página predeterminada). Tengo <VirtualHost *:443> ... Redirect / https://baseurl/ ... </VirtualHost> pero la url permanece igual. He hecho lo mismo para la versión que no es SSL y se redirige correctamente. ¿Algunas ideas?
Desarrollador Newteq