2009-02-15 14 views
14

Usando Apache2 en un sistema Linux ¿hay alguna manera de tener múltiples VirtualDocumentRoot usando mod_vhost_alias?Apache Multiple VirtualDocumentRoot

Esta convención está nombrando Actualmente estoy usando y me gustaría seguir utilizando:

host     directory 
127.0.0.1 domain  domain.com 
127.0.0.1 sub.domain domain.com_sub 

Luego, en mi sección de host virtuales de httpd.conf que tengo:

NameVirtualHost 127.0.0.1 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%0.0.com 
</VirtualHost> 

<VirtualHost 127.0.0.1> 
    VirtualDocumentRoot /var/www/%2.0.com_%1 
</VirtualHost> 

El problema con esto es cuando visito sub.domain el registro de errores de Apache muestra que está buscando /var/www/sub.domain.com en lugar de /var/www/domain.com_test, lo que me lleva a creer que solo lee la primera regla y luego falla, pero lo que me gustaría hacer es usar cualquier raíz de documento que satisfaga de las dos reglas de VirtualDocumentRoot.

+4

Estoy asumiendo que resolvió este problema, pero yo he publicado a continuación para Completitud, ya que esto aparece en las búsquedas de Google. Es posible que desee marcar esta pregunta como respondida? – starmonkey

Respuesta

13

Apache generalmente elegirá el primer host virtual cuyo ServerName o ServerAlias coincida con el nombre de host provisto en el encabezado HTTP Host. En su caso, dado que no tiene directivas ServerName, Apache supuestamente utiliza una búsqueda DNS inversa en la dirección IP para falsificar el nombre de un servidor, y suponiendo que el DNS inverso conduzca a domain.com, que no coincide, Apache se configura de manera predeterminada el primer host virtual. Suena complicado, lo sé ... la conclusión es que debe usar ServerName y ServerAlias para hacer explícita la configuración. Probar algo de la misma familia:

NameVirtualHost 127.0.0.1 
<VirtualHost 127.0.0.1> 
    ServerName domain.com 
    ServerAlias www.domain.com 
    VirtualDocumentRoot /var/www/%0 
</VirtualHost> 
<VirtualHost 127.0.0.1> 
    ServerName sub.domain.com 
    ServerAlias *.domain.com 
    VirtualDocumentRoot /var/www/%2.%3_%1 
</VirtualHost> 

que deben utilizar para /var/www/domain.comhttp://domain.com y /var/www/www.domain.com para http://www.domain.com, ambos de los cuales son atendidos por el primer host virtual, y /var/www/sub.domain.com para http://sub.domain.com, /var/www/blah.domain.com para http://blah.domain.com, y así sucesivamente.

+0

Esto me salvó el día. Estaba cambiando entre dos archivos de VirtualHost con las definiciones de VirtualDocumentRoot. Sabía que tenía que haber una mejor manera y lo descubriste. ¡Gracias! –

+0

La solución resolvió mi problema. Pero tengo una nueva pregunta, para algunos subdominios especiales, necesito hacer alguna configuración especial, como agregar configuración JK o establecer un archivo de registro personalizado. ¿Cómo podemos hacer eso? – Stony

+0

@Stony Sugiero preguntar en [webmasters.SE] o quizás [SF]. –

2

En cuanto a la OP y el problema con "/ var/www/html "estar configurado:

El problema que tuve al hacerlo fue usar% 1 en vez de% 2. Aquí está mi ejemplo de trabajo:

ServerAlias www.*.org.au 
UseCanonicalName Off 
VirtualDocumentRoot /path/to/sites/%2/pub 

Espero que ayude a alguien!

He leído los documentos en "Interpolación del nombre del directorio" en mod_vhost_alias docs.

4

Tienes que calificar las referencias cuando quieres poner un '.' en la ruta del archivo Entonces necesita tenerlo así:

VirtualDocumentRoot /var/www/%2.0.%3_%1 
0

Finalmente encontré una configuración que permite la creación flexible de subdominios.

Ver documentos de Apache en mod_vhost_alias

Si su dominio dev raíz tiene 3 partes como dev.example.com puede usar %-4+ como marcador de posición para todo lo anterior al dominio raíz. Si tiene 4 partes, use %-5+.

<VirtualHost *:80> 
    VirtualDocumentRoot "/var/www/%-4+/webroot" 
    ServerName www.dev.example.com 
    ServerAlias *.dev.example.com 
    php_admin_value auto_prepend_file /var/www/setdocroot.php 
</VirtualHost> 

De esta manera se puede crear un directorio llamado /var/www/sub.domain/webroot y acceder a ella con la url sub.domain.dev.example.com.

La línea php_admin_value auto_prepend_file /var/www/setdocroot.php fija el docroot en algunos sistemas como OSX 10.9+

Aquí es el contenido del setdocroot.php:

<?php 
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); 
?>