2009-03-24 10 views
52

Tengo una lista larga e intrincada de directivas <VirtualHost>, y tengo que duplicarlas en grupos separados <VirtualHost> para los puertos 80 y 443 porque estoy usando SSL. Cada vez que actualizo mis reglas de mod_rewrite tengo que recordar hacerlo en ambos lugares o de lo contrario romperé mi aplicación ... esta duplicación está buscando problemas. ¿Hay alguna manera de combinar o alias estos? La única diferencia entre los dos es que la versión del puerto 443 contiene el SSLEngine, SSLCertificateFile y similares.¿Tengo que duplicar las directivas de Virtualhost para el puerto 80 y 443?

Mi <Virtualhost> contiene muchos mod_rewrite normas, reglas, directivas LocationMatch CGI, etc.

Además, no puedo usar los archivos .htaccess.

+1

Un duplicado de http://serverfault.com/questions/83669/apache2-with-ssl-do-i-have-to-copy-virtualhost-blocks –

Respuesta

43

No se puede usar una directiva de inclusión para incluir las reglas comunes. here

article

ej .:

<VirtualHost _default_:80> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:*> 
    ... 
    include conf/common_rule.conf 
</VirtualHost> 

<VirtualHost _default_:443> 
    ... #SSL rules 
    include conf/common_rule.conf 
</VirtualHost> 
+0

gracias por esto; Por cierto, [aquí hay una versión actualizada] (http://httpd.apache.org/docs/2.4/mod/core.html#include) de la directiva 'include' de apache, que es el primer recurso vinculado en su respuesta –

+0

gracias, lo he actualizado ahora. – sfossen

2

se puede poner la configuración común en un archivo separado e incluirlo en ambos segmentos de host virtual. Por ejemplo:

<VirtualHost 192.168.1.2:80> 
    Include conf/common.conf 
</VirtualHost> 

<VirtualHost 192.168.1.2:443> 
    Include conf/common.conf 
    (put your ssl specific cofiguration stuff here ...) 
</VirtualHost> 
0

También podría especificar las directivas comunes dentro de un contenedor en lugar de dentro del mismo. Eso es lo que hago, sobre todo porque prefiero las reglas de mod_rewrite a nivel de directorio en lugar de a nivel de servidor, pero también debería funcionar igual para ti.

+3

Te estás perdiendo una palabra críticamente importante. ¿Puedes agregar eso? Y si pudieras dar un ejemplo que también sería útil. – iconoclast

32

Puede usar cualquier número de hosts y puertos en una única directiva Virtualhost.

<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> 

En mi caso utilicé.

<VirtualHost *:80 *:443> 
    ServerName loop.lk 

.... 
SSLEngine on 
SSLCertificateFile /etc/apache2/ssl/local.crt 

</VirtualHost> 
+8

Parece que SSLEngine se aplica incluso cuando se accede al sitio a través de http, lo que da como resultado una página de error. –

+2

Si tiene un bloque '', asumo que puede tener un bloque separado para '' que solo incluye el material SSL. ¿Es eso correcto? – iconoclast

+3

@iconoclast No, no puede tener otra directiva . Puede utilizar \t .... O \t ... –

7

sentimos a subir un viejo post como este, pero con el fin de ayudar a otros empleados de Google por ahí que quería compartir cómo me trató con él:

Tengo un par de host virtuales en mi localhost, Diga: localhost, foo.com, bar.com

Al tratarse de un sitio localhost en mi computadora portátil (macosx) pude obtener certificados autofirmados y, por lo tanto, la parte ssl es la misma para todos los vhosts. ..

Lo que hice fue esto:

Creé el directorio /etc/apache2/extra/vhosts/.

he creado un /etc/apache2/extra/vhosts/localhost.conf:

ServerName localhost 
DocumentRoot "/www/localhost" 
<Directory /www/localhost> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/localhost.error_log" 
CustomLog "/var/log/apache2/localhost.access_log" common 

Un /etc/apache2/extra/vhosts/foo.conf:

ServerName foo.com 
DocumentRoot "/www/foo.com" 
<Directory /www/foo.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/foo.com.error_log" 
CustomLog "/var/log/apache2/foo.com.access_log" common 

Un /etc/apache2/extra/vhosts/bar.conf:

ServerName bar.com 
DocumentRoot "/www/bar.com" 
<Directory /www/bar.com> 
    Require all granted 
</Directory> 
ErrorLog "/var/log/apache2/bar.com.error_log" 
CustomLog "/var/log/apache2/bar.com.access_log" common 

Y por último, una /etc/apache2/extra/vhosts/ssl.conf:

SSLEngine on 
SSLCertificateFile "/etc/apache2/ssl/server.crt" 
SSLCertificateKeyFile "/etc/apache2/ssl/server.key" 

Y en mi /etc/apache2/extra/httpd-vhosts.conf:

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/localhost.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/foo.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/foo.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 

<VirtualHost *:80> 
    Include /etc/apache2/extra/vhosts/bar.conf 
</VirtualHost> 
<VirtualHost *:443> 
    Include /etc/apache2/extra/vhosts/bar.conf 
    Include /etc/apache2/extra/vhosts/ssl.conf 
</VirtualHost> 
+0

También fue con esta solución. Funciona genial –

Cuestiones relacionadas