2008-12-05 7 views
18

El título casi lo dice todo. :-) Tengo muchos hosts virtuales y quiero poner un único bloque de reescritura en la parte superior del archivo httpd.conf que reescribe las URL, sin importar a qué host virtual pueda dirigirse la solicitud. ¿Cómo diablos hago esto?¿Cómo puedo implementar una RewriteCond/RewriteRule global en Apache que se aplique a todos los hosts virtuales?

Encontré this pero mi pregunta es la misma: ¿cómo puedo hacer esto sin recurrir a los archivos .htaccess y realizar alguna otra acción para cada host virtual?

OMGTIA!

+0

Mierda. He dejado perplejos a todos. – hourback

+0

Parece que tienes. – UnkwnTech

Respuesta

9

Especificar RewriteOptions InheritDown en el ámbito primario (como httpd. conf) para aplicar sus reglas en los Hosts Virtuales secundarios sin modificarlos.

Esto sólo funcionará en los host virtuales, donde la directiva RewriteEngine se establece en on:

Tenga en cuenta que reescriben las configuraciones no son heredados por los hosts virtuales. Esto significa que debe tener una directiva RewriteEngine on para cada host virtual en el que desee utilizar reglas de reescritura.

(source)

Apache soporta este puesto 2.4.8 (no disponible en el momento de la pregunta original).

De la documentación para RewriteOptions:

InheritDown

Si esta opción está activada, todas las configuraciones niño herede la configuración de la configuración actual. Es equivalente a especificar RewriteOptions Heredar en todas las configuraciones secundarias. Consulte la opción Heredar para obtener más detalles sobre cómo se manejan las relaciones padre-hijo. Disponible en Apache HTTP Server 2.4.8 y posterior.

InheritDownBefore

Como InheritDown anterior, pero las reglas del ámbito actual se aplican antes que las reglas especificadas en el alcance de cualquier niño. Disponible en Apache HTTP Server 2.4.8 y posterior.

IgnoreInherit

Esta opción fuerza a las configuraciones actuales y los niños a ignorar todas las reglas que se hereda de un padre o especificando InheritDown InheritDownBefore. Disponible en Apache HTTP Server 2.4.8 y posterior.

(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)

+0

Tenga en cuenta que esto todavía requiere 'RewriteEngine On' establecido en la sección de Virtual Host. – brocksamson

+1

"Tenga en cuenta que las configuraciones de reescritura no son heredadas por los hosts virtuales. Esto significa que debe tener una directiva RewriteEngine on para cada host virtual en el que desee utilizar reglas de reescritura". https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html –

5

Nunca lo he probado, por lo que podría no funcionar, pero intentaría agregar una directiva include en todos los bloques de host virtuales a un único archivo. Tendría que cambiar cada bloque de configuración de host virtual una vez, pero después de eso, debería tener un lugar central desde el cual realizar cambios. YMMV.

+0

La mejor respuesta para mí :) ya que no está restringida a mod_rewrite, pero funciona con cualquier característica/directiva de Apache. – CedX

9

Parece que la solución más simple posible es añadir

RewriteOptions inherit 

de cada directiva VirtualHost. Esto es al menos mucho más simple que jugar con los archivos .htaccess. Apache es bastante claro en el hecho de que

por defecto, las configuraciones de reescritura son no heredadas. Esto significa que usted necesita tener una directiva RewriteEngine en para cada host virtual en que desee usar. (http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html)

y al parecer la manera de cambiar el valor por defecto es a través de RewriteOptions en el niño (o host virtual de dirección), por lo que tiene que hacer algo en cada niño.

+2

Desde Apache 2.4.8 puede usar httpd.conf (u otros) con 'RewriteOptions InheritDown', es equivalente a especificar' RewriteOptions Inherit' en todos los vhosts. –

+0

@MatejSnoha, ¿quieres enviar tu comentario como una solución a la pregunta? Puede ser más visible para otros que buscan una solución a este problema. No estoy en condiciones de probarlo yo mismo, pero me gustaría saber si ayuda a otros. – hourback

2

Si solo está intentando reescribir algo en el dominio parte del nombre, p. para corregir un error ortográfico común, ni siquiera necesitas la opción 'heredar'. Configuré un host virtual sin nombre para capturar todos los nombres de host no válidos y volver a enviarlos correctamente antes de redirigirlos.

Dado que esto utiliza redireccionamientos, se encontrará el host virtual apropiado después de que se hayan aplicado las reescrituras.

Options +Indexes +FollowSymLinks 
RewriteEngine on 
# If it begins with only domain.com, prepend www and send to www.domain.com 
RewriteCond %{HTTP_HOST} ^domain [NC] 
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301] 

# Correct misspelling in the domain name, applies to any VirtualHost in the domain 
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above 
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC] 
RewriteRule ^(.*) %{HTTP_HOST}$1 [C] 
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301] 

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them 
<VirtualHost *> 
    RewriteEngine on 
    RewriteOptions inherit 
</VirtualHost> 
+0

Pensé que dijiste que ni siquiera necesitabas la opción "heredar", pero la incluiste en tu regla – huyz

+0

. Utilizamos esto para corregir la ortografía de nuestro nombre de dominio.En ese caso, es suficiente con 'heredar' solo para el comodín VirtualHost. Si tiene opciones de reescritura más complejas, puede que necesite incluir 'heredar' en cada VirtualHost. –

+0

Ah, entonces quiso decir que no necesita la opción 'heredar' en cada host virtual. Lo tengo. – huyz

0

Siempre he usado un VHost "cajón de sastre" de las directivas que quería en todos los ámbitos, como ......

Listen 80 
NameVirtualHost *:80 

<VirtualHost *:80> 
ErrorLog "/var/log/apache2/error_log" 
</VirtualHost> 

<VirtualHost *:80> 
ServerName alloftherestoftheVHosts.com 
DocumentRoot "/ServiceData/......... 
............ 

y siempre parecía a trabajar. ... los registros de errores se estaban combinando correctamente, etc. ... pero es posible que este fuera el resultado de una directiva anterior/conflictiva/similar.

Nota personal .. Quien ideó el esquema de configuración de Apache y la sintaxis era un gilipollas, o un grupo de dingbats, que pasaban demasiado tiempo en su cueva .... Todo esto debe ser exorcizado y XMLized, o ¡alguna cosa! Aunque ambos son muy diferentes ... el proceso de instalación Hola-gatito de Cherokee .. brutalmente a la sucinta NGinx config .... son ambos de manera mucho más lógica ..

11

Por defecto, los valores de configuración de la mod_rewrite contexto principal del servidor no son heredados por los hosts virtuales.Para hacer las configuraciones del servidor principal se aplican a los hosts virtuales, debe colocar las siguientes directivas en cada sección <VirtualHost>:

RewriteEngine On 
RewriteOptions Inherit 

clic http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html encontrar más información

Cuestiones relacionadas