¿Cómo deshabilitar VirtualHost predeterminado en apache2?

10

En apache2 por diseño, cualquier solicitud http con un Host desconocido se dirigirá al primer VirtualHost cargado. ¿Hay alguna forma de desactivar esta función? Dicho de otra manera, quiero tener un servidor web donde el usuario solo pueda acceder a definiciones de VirtualHost con nombre explícito. Cualquier otro nombre de host no mencionado explícitamente en una línea ServerName o ServerAlias ​​debe ignorarse en silencio.

es posible?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>

Actualización: como se sugiere a continuación y en otros lugares, ignorar silenciosamente una solicitud puede no ser una buena idea y tal vez rompa los RFC para HTTP. Sin embargo, dado que los hosts virtuales están diseñados para simular tener múltiples servidores HTTP físicos separados, el enfoque de ignorar en silencio no me parece irrazonable. Sería lo mismo que el alojamiento virtual basado en IP y el cortafuegos de algunas de las IP (quizás no para todos los clientes).

Harvey
fuente

Respuestas:

4

No estoy seguro de que "fallar en silencio" sea una buena idea. Debe darle al cliente al menos alguna indicación de lo que sucedió. Tal vez podría enviar un error "desaparecido" http 410. Algo como esto debería hacer el truco:

RewriteRule ^.*$ - [G]

Además, debería poder especificar un documento de error 410 personalizado, que podría ser una página html en blanco.

EEAA
fuente
Terminé descubriendo esta solución por mi cuenta también. Debería agregar líneas para cargar mod_rewrite y "RewriteEngine On", teniendo en cuenta que pueden no ser necesarias. Eran para mi. :)
Harvey
2
Además, dado que solo estamos diciendo que se ha ido o prohibido y, lo que es más importante, el "-" evita la sustitución, la expresión regular puede ser mucho más simple:RewriteRule . - [F]
Harvey
17

Aquí hay una forma alternativa que no involucra reglas de reescritura:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
Atomizador
fuente
2
Esta debería ser la solución aceptada. +1
Greg Schmit
No tengo claro esta solución. Tengo varios archivos VHOST y ¿acabo de crear uno nuevo con esto? Lo intenté y llamé al archivo 001.default.conf pero todavía tengo que redirigir mis subdominios.
Frantumn
@Frantumn Como se señaló en la pregunta, "cualquier solicitud http con un Host desconocido se dirigirá al primer VirtualHost cargado ". Por lo tanto, este "valor predeterminado" <VirtualHost>debe definirse primero en la configuración del servidor. Precisamente en qué archivo debe estar depende su configuración. (Sin embargo, su problema de "subdominios redirigidos" podría ser un problema no relacionado)
MrWhite
Huh Cuando utilizo otros dominios que apuntan a mi servidor, no hace el 403, solo elige el primer host virtual que encuentra, aunque el nombre del servidor no coincida
jjxtra
1

esto funcionó para mí

<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
  ServerName myactualservername.com
  ServerAlias *
  <Location />
    Deny from all
    Options None
    ErrorDocument 403 Forbidden.
  </Location>
</VirtualHost>

reemplace xxxx con su ipv4 real e ipv6
reemplace myactualservername.com con un sitio web real atendido por la máquina

Estoy usando el host virtual basado en el nombre.
el crédito para esta solución va a
https://serverfault.com/a/82309/459796

Yashesh Bhatia
fuente