configuración correcta de apache virtual hosts (name based)

Iniciado por gAb1, 14 Agosto 2016, 06:40 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Estoy tratando de configurar manualmente los vhosts para varias páginas, aunque de momento estoy trabajando con un solo dominio, la idea es ir poniendo más. De momento estoy intentando configurar un solo dominio y varios subdominios.

La configuración vhosts la he repartido en varios archivos especificos para cada dominio/subdominio, así puedo activarlos o desactivarlos facilmente (tal y como recomiendan en la guia de arch linux):

httpd.conf
Código (apache) [Seleccionar]
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
# Available Vhosts
Include conf/vhosts/example.dom
Include conf/vhosts/sub1.example.dom
Include conf/vhosts/sub2.example.dom


El archivo de configuración principal lo dejo para el bloque vhosts por defecto, el que se use cuando se accede al servidor mediante la ip pública o los nameservers (ns1.example.com), etc... Aquí estoy teniendo problemas y necesito saber como configurar correctamente el bloque vhosts default.

Código (apache) [Seleccionar]
<VirtualHost xxx.xxx.xxx.xxx:*>
    DocumentRoot "/srv/http/default"
    ServerName localhost
</VirtualHost>


o

Código (apache) [Seleccionar]
<VirtualHost *>
    DocumentRoot "/srv/http/default"
    ServerName localhost
</VirtualHost>


Si uso el primero se muestra siempre (da igual que pongas dominio/subdominio) el main document root de apche, que en arch linux es /srv/http y claro... puedes navegar por todas las carpetas que tengas (incluso desactivando -Indexes puedes usar la barra de navegación para averiguar nombres...).

Si uso el segundo se muestra siempre la carpeta default.

He probado quitando el bloque virtualhost default (comentando el archivo en httpd.conf) y lo mismo, se ignoran los bloques virtualhost de cada archivo, y siempre se muestra el main document root.

Código (apache) [Seleccionar]
# conf/vhosts/domain.dom
<VirtualHost domain:80>
    ### Igual que abajo pero sin la configuración SSL
</VirtualHost>
   
<VirtualHost domain.com:443>
    ServerAdmin webmaster@domain.com
    DocumentRoot "/srv/http/domain.com/www"
    ServerName domain.com:443
    ServerAlias www.domain.com:443
    Protocols h2 h2c
   
    <Directory "/srv/http/domain.com/www">
        Require all granted
   
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^index\.php$ - [L]
            RewriteRule . index.php [L]
        </IfModule>
    </Directory>
   
    <IfModule dir_module>
        DirectoryIndex index.php
    </IfModule>
   
    #SSLEngine on
    #SSLCertificateFile "/etc/httpd/conf/apache.crt"
    #SSLCertificateKeyFile "/etc/httpd/conf/apache.key"
    ErrorLog "/var/log/httpd/domain.com-error_log"
    CustomLog "/var/log/httpd/domain.com-access_log" common
</VirtualHost>


Esta configuración funciona en mi ordenador personal, usando el sistema operativo Manjaro (que es Arch Linux) y recuerdo que funcionaba bien. Ahora estoy configurando un servidor ARM de scaleway y estoy usando arch linux.

¿Como puedo configurar correctamente los virtual hosts para que haya un bloque que muestre una página por defecto cuando ningún nombre de dominio/subdominio coincida con los que tengo?

Gracias.

gAb1

Lo dejo por si a alguien le surge el mismo problema. Al final he conseguido hacer que funcione, pero sigo sin entender por qué no funciona usando los nombres de dominio en los bloques:

Usando asterisco y el puerto (por si usas SSL):

#1st block
<VirtualHost *:80>
     ServerName  localhost
</VirtualHost>

#2nd block
<VirtualHost *:80>
     ServerName  mydomain.com
</VirtualHost>

#3rd block
<VirtualHost *:443>
    ServerName  mydomain.com
</VirtualHost>

#4th block
<VirtualHost *:443>
    ServerName  sub1.mydomain.com
</VirtualHost>

#5th block
<VirtualHost *:443>
    ServerName  sub2.mydomain.com
</VirtualHost>


http://mydomain.com/ y https://mydomain.com/ ambos irán al tercer y cuarto bloque, respectivamente. Pero http://www.mydomain.com/ y https://www.mydomain.com/ ambos irán al primer bloque ya que no se declaró ServerAlias a www.mydomain.com en ambos bloques. Los subdominios solo funcionarán por https, si intentas acceder por el puerto 80 llevará al primer bloque. Espero que se entienda el ejemplo que puse.

WHK

Para eso existe el ServerAlias:

Intenta escribir cualquier código mal escrito para que te arroje un error, despues reinicia el servidor apache y si no te da error es porque no está incluyendo el host virtual.

De todas maneras te recomiendo crear una carpeta llamada sites-available y otra llamada sites-enabled, entonces tus archivos de host virtuales los pones en sites-available y en sites-enabled creas el enlace simbolico de los host virtuales que quieres habilitar y en el httpd.conf o apache2.conf le indicas un include global: IncludeOptional sites-enabled/*.conf

Por otro lado, si esto esta bien incluido puedes tener mas de un problema, por ejemplo que no tengas establecido los archivos indices por defecto, que el -indexes no este fuera de los host virtuales, que no este habilitado php (si es que estas intentando cargar un indice php) o que no este funcionando correctamente el modulo cgi (si estas intentando cargar un indice pl, sh, bin, o lo que sea)

Saludos.

gAb1

Lo del orden de los bloques ya lo entiendo, se trata de poner primero el bloque *:80 y *:443 con servername localhost (y un document root con un index.html "it works" o lo que sea) y luego los demás bloques. De esta manera cualquier nombre que no coincida irá a los dos primeros.

Si, exacto, es lo que tenia en mente, usar el sistema que tiene debian (y derivados) para administrar los vhosts.

Los indices los tengo en cada bloque directory dentro de cada bloque virtualhost, de esta manera cada dominio/subdominio tiene su propio indice (por ejemplo el subdominio static no necesita php, pero los demás si).

El -Indexes está en el archivo de configuración principal (httpd.conf) en su bloque directory /srv/http (osea desactivado el indexamiento de apache de manera global y no tener que desactivarlo para cada dominio/sbudominio).

PHP lo tengo por mod_proxy_fcgi y php-fpm, aunque la configuración cgi no la he tocado (la verdad es que todavia no tengo ni idea de para que sirve :P), todo está funciona perfectamente.

Al final resulta que el server alias no lo voy a necesitar, ya que el dominio sin www lo voy a dejar que redireccione automaticamente a www y puerto 443 (gracias a let's encrypt por darnos certificados gratis  ;D). Y de paso también activo HTST (y me falta una opción de seguridad más que no recuerdo):

<VirtualHost *:80>
   ServerName example.com
   Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
   ServerName example.com
   Redirect permanent / https://www.example.com/
   SSLEngine On
   # etc...
   Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

<VirtualHost *:443>
   ServerName www.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
   # etc...
   Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>

WHK

A la redirección podrias agregar %{REQUEST_URI} y una cabecera 301 para que mantengan la misma url solicitada en caso de que cambies tu dominio y asi no te afecta tanto el pagerank.