¿Por qué Apache puede ignorar un host virtual con un ServerName que coincida con la URL solicitada?

26

Estoy tratando de agregar un segundo host virtual a mi configuración de apache, pero parece que no puedo usar el nuevo host virtual.

Mi httpd.confsolo contiene la siguiente línea:

ServerName radiofreebrighton.org.uk

También tengo un ports.confarchivo que contiene lo siguiente:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Tengo dos archivos en los sites-availableque se vincularon sites-enabledpor a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

El contenido de la primera es:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin [email protected]
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

El contenido de este último es:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin [email protected]
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Pero cada vez que solicito una página de trafalgararches.co.uk, recibo una página de radiofreebrighton.org.uk. por que podria estar pasando esto? ¿Cómo puedo arreglarlo?


Editar:

Configuración de host virtual tal como lo entiende apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Recogido a través de apache2ctl -Saka httpd -S.)

Tom Wright
fuente
1
No estoy seguro es la causa, pero se debe quitar las barras de los extremos de sus ServerNamey ServerAliaslíneas. Además, asegúrese de haber reiniciado Apache.
EEAA
Estoy casi seguro de que esa es la causa. Significa que el nombre de host en la solicitud nunca coincidirá con el ServerName para ese host virtual.
Larsks
1
@ErikA, @larsks - ¡Ustedes tienen muchas esperanzas! Eliminé las barras diagonales y reinicié Apache, pero no cambió nada.
Tom Wright
1
¿Tienes NameVirtualHost *:80algún lugar en tu configuración?
Larsks
1
No estoy seguro de si los sitios mencionados anteriormente son producción o desarrollo, pero en realidad ir a esas URL me da dos páginas diferentes (páginas correctas por lo que parece). Si los vhosts anteriores están en un servidor de desarrollo, ignore este comentario. De lo contrario, es posible que haya solucionado su problema en algún lugar del camino y aún tenga una copia en caché.
cyberx86

Respuestas:

15

Bueno, esta pregunta tiene más de un año, pero me he encontrado con un "problema" similar. Esto puede ser obvio, pero no olvide reiniciar el servicio apache después de habilitar un host virtual adicional. Vea, después de ejecutar a2ensitepara el segundo host virtual, la salida de apache2ctl -Smostrará que ambos sitios están disponibles (y uno de ellos es el predeterminado), incluso si no volvió a cargar Apache.

Supongamos que tiene dos hosts virtuales: sitio1 y sitio2. Ejecutas a2ensite site1y luego vuelves a cargar el servicio apache. Ahora puede acceder http://site1y es el valor predeterminado. Ahora corre a2ensite site2, pero olvida reiniciar apache. La salida de apache2ctl -Sserá:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Pero cuando intenta cargar http://site2, en realidad cargará el sitio predeterminado (sitio1), ya que la configuración no se carga.

prngleo
fuente
Obtengo el mismo resultado, pero incluso así no carga el segundo sitio web.
arqam
15

Tuve un problema similar en el que mis vhosts adicionales en el puerto 443 (SSL / HTTPS) se dirigían al directorio del primer vhost listado. Apache esencialmente ignoraba la propiedad del nombre del servidor y coincidía solo en el puerto ip:.

Resulta que me faltaba el comando 'NameVirtualHost *: 443' para habilitar el alojamiento virtual con nombre para el puerto 443.

'NameVirtualHost *: 443' solo debe llamarse una vez, y debe definirse sobre sus vhosts para el puerto 443. Pongo mi definición en el archivo ports.config para que se vea así:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

No olvide reiniciar apache después de cualquier cambio.

Lucas
fuente
1
Por lo que vale ... en Apache 2.4.18, el uso NameVirtualHostproduce este mensaje al inicio:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart
4

Mis 2 centavos: como tengo que mantener una IP (no quiero que el sitio se sirva en todas las redes instaladas), sucedió que después de que la IP privada local del servidor cambió, olvidé cambiarla aquí:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Por supuesto, no es un problema de Apache hacerle saber que la IP no existe localmente.

maraboshi
fuente
2

Tom, mira aquí http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Nota

Tenga en cuenta que el "servidor principal" y los servidores predeterminados nunca serán atendidos para una solicitud a una dirección IP NameVirtualHost (a menos que por alguna razón especifique NameVirtualHost pero luego no defina ningún VirtualHosts para esa dirección).

Por lo tanto, debería estar bien si cambia el valor predeterminado a la dirección IP de su servidor.

Marcel Kronenberg
fuente
Lo intenté, pero no cambió nada. También me gustaría evitar vincularme a una IP en particular, así que voy a cambiarla nuevamente. Además, debo señalar que el vhost predeterminado es el que funciona.
Tom Wright
1

Encuentro la respuesta desde aquí: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Ponga 2 nombre de servidor en la misma etiqueta de VirtualHost 1 como a continuación:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Terminé teniendo problemas con el segundo sitio porque tenía dos bloques de etiquetas de VirtualHost.

Tu Uyen
fuente
0

Tuve este problema al migrar sitios a un nuevo servidor Ubuntu 16. Después de un poco de rascarse la cabeza, me di cuenta de que el Módulo SSL no estaba habilitado de manera predeterminada, por lo que cualquier cosa dentro de los <IfModule mod_ssl.c>bloques se ignora en silencio.

Hace años, envolví todos mis vhosts SSL en este condicional, y esta vez acababa de copiar los archivos de configuración en el nuevo servidor.

Lo arreglé habilitando el módulo:

sudo a2enmod ssl
scipilot
fuente
0

Descubrí que la fuente de este problema era una entrada / etc / hosts en mi servidor con la URL apuntando a la IP externa del servidor.

En un punto, debo haberlo configurado antes de que DNS estuviera listo, así que ingresé una entrada / etc / hosts en mi servidor apuntando a su propia IP externa:

1.2.3.4 vhost.example.com

Luego configuré un ServerAlias ​​en un sitio existente para "vhost.example.com"

Pero nada de lo que pudiera hacer evitaría que Apache sirva el sitio default-ssl.conf para solicitudes SSL a vhost.example.com. El puerto 80 HTTP funcionó bien, pero el SSL siempre mostró el sitio predeterminado en su lugar. Al final, este hilo SO me llevó a probar "apachectl -S" que muestra sitios y finalmente pude resolverlo.

Por lo tanto, si obtiene el sitio SSL predeterminado en lugar del sitio que espera, ¡asegúrese de no agregar la dirección IP externa de su servidor en una entrada / etc / hosts! Algo muy extraño haber hecho en retrospectiva, ¡pero espero que esto ayude a alguien más!

Profesor Falken
fuente