
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_macro
para 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 If
estructura de Apache y manipule la solicitud. Verla documentación principal para If
syla lista de expresiones disponibles para usar en él. Podrías hacer algo como:
<If "%{SERVER_PORT} == '443'">
# Do stuff
</If>
Con respecto a su VirtualHost
etiqueta, 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 NameVirtualHost
y Listen
en su apache2.conf
archivo 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.