Apache2 VirtualHost IfPort?

Apache2 VirtualHost IfPort?

Me gustaría hacer un host virtual como este:

<VirtualHost *:80 *:443>
    <IfPort 443>
        SSLEngine On
        ...
    </IfPort>

    ...
</VirtualHost>

Entonces, si se accedió al host a través del puerto 443, quiero agregar algunas funciones adicionales. ¿Puedo lograr esto de alguna manera o tengo que separarlo en 2 hosts virtuales?

Respuesta1

Utilizo mod_macropara resolver este problema en un servidor que aloja un montón de dominios diferentes... Instale el módulo (difiere según el SO/Distro), luego configure algo como esto:

LoadModule macro_module         libexec/apache22/mod_macro.so

<Macro VHost $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

<Macro VHostSSL $host>
        <VirtualHost *:80>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost>
        <VirtualHost *:443>
                DocumentRoot /usr/local/www/$host/data
                ServerName $host
                ServerAlias *.$host

                SSLEngine on
                SSLCertificateFile /usr/local/www/$host/ssl/$host.crt
                SSLCertificateKeyFile /usr/local/www/$host/ssl/$host.key

                ScriptAlias /cgi-bin/ "/usr/local/www/$host/cgi-bin/"
                IncludeOptional etc/apache22/vhosts/$host
        </VirtualHost> 
</Macro>

Use VHostSSL example.com 
Use VHost    example.net

Es muy fácil agregar un nuevo dominio; cualquier configuración específica del dominio se incluye en el archivo de inclusión.

Respuesta2

usando la solución de John obtengo esto

Apache 2 is starting ...
AH00526: Syntax error on line 53 of .../httpd-vhosts.conf:
SSLEngine not allowed here

como dijo John, la mejor manera es tener 2 hosts virtuales; pero mi código de host virtual tenía más de 150 líneas (muchos servidores proxy inversos) ya que no quería tener 2 de cada código (y un archivo de configuración muy largo) Terminé haciendo esto que funciona:

1.Cree un host virtual para un host virtual que no sea SSL.

2.Cree otro host virtual y invierta el proxy para el primer host virtual.

<VirtualHost *:443>
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCertificateFile "...cert.crt"
    SSLCertificateKeyFile "...server.ssl.key"
    ... (any ssl specific config)

    ProxyPreserveHost On
    ProxyPass / http://localhost:80/
    ProxyPassReverse http://localhost:80/ http://yourdomain.com/
</VirtualHost>

Esta no es en absoluto una solución buena ni amigable con el rendimiento, pero si la razón detrás de no querer 2 hosts virtuales es evitar tener 2 versiones de todas las configuraciones de hosts virtuales (lo que significa cambiar 2 líneas cada vez que desea cambiar algo), esto funciona.

Respuesta3

Otra opción para evitar la duplicación sería mantener la configuración del host virtual en un archivo específico e incluirlo con una inclusión:

/etc/path/to/config/example.com.conf:

ServerName example.com.conf
DocumentRoot /var/www/something
# Any other config you want to apply to both vhosts

Y su archivo de hosts virtuales:

<VirtualHost *:443>
    SSLEngine on
    # Other SSL directives
    Include /etc/path/to/config/example.com.conf
</VirtualHost>
<VirtualHost *:80>
    Include /etc/path/to/config/example.com.conf
</VirtualHost>

Respuesta4

Eche un vistazo a la Ifestructura de Apache y manipule la solicitud. Verla documentación principal para Ifsyla lista de expresiones disponibles para usar en él. Podrías hacer algo como:

<If "%{SERVER_PORT} == '443'">
    # Do stuff
</If>

Con respecto a su VirtualHostetiqueta, no veo esa solución en la documentación de Apache2. Verhttp://httpd.apache.org/docs/2.2/en/vhosts/examples.html#porty pruebe su opción: Apache2 usa una similar para diferentes IP en lugar de diferentes puertos (http://httpd.apache.org/docs/2.2/en/vhosts/examples.html#intraextra).

Aún así recomendaría el uso de 2 hosts virtuales distintos, mucho más claro. Necesitará dos NameVirtualHosty Listenen su apache2.confarchivo de todos modos.

Editar

No me di cuenta de que esta solución en realidad arrojaba un error, pero volvamos al concepto en sí... Escuchar en 80 o 443 en realidad no es ningún problema. Apache2 estaría encantado de proporcionar una solución elegante para eso, si no fuera por... el cifrado. Apache2 fue desarrollado en C y, más allá de subprocesos y bifurcaciones, utiliza sockets. En C, el uso de SSL requiere la inicialización de los componentes OpenSSL y algunas soluciones al socket básico para implementar todo el sistema SSL. Estás buscando una solución fácil, pero todo el mecanismo detrás es complicado... Es por eso que no puedes habilitar SSL en un host virtual básico: HTTP y HTTP son componentes diferentes, y en la forma Apache2, me temo que hay No hay concepto de herencia entre el primero y el segundo.

información relacionada