apache - redirectmatch - rewriterule ejemplos
¿Cómo puedo implementar una RewriteCond/RewriteRule global en Apache que se aplique a todos los hosts virtuales? (6)
De forma predeterminada, los hosts virtuales no heredan las configuraciones de configuración mod_rewrite del contexto del servidor principal. Para que la configuración del servidor principal se aplique a los hosts virtuales, debe colocar las siguientes directivas en cada sección de <VirtualHost>
:
RewriteEngine On
RewriteOptions Inherit
haga clic en http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html para encontrar más información
El título 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?
Encontré esto, pero mi pregunta es la misma: ¿cómo puedo hacer esto sin recurrir a archivos .htaccess y realizar alguna otra acción para cada host virtual?
OMGTIA!
Nunca lo he probado, por lo que podría no funcionar, pero trataría de agregar una directiva de 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.
Parece que la solución más simple posible es agregar
RewriteOptions inherit
a 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
de forma predeterminada, las configuraciones de reescritura no se heredan. Esto significa que debe tener una directiva RewriteEngine on para cada host virtual en el que desee utilizarla. ( http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html )
y aparentemente la forma de cambiar el valor predeterminado es a través de RewriteOptions en el niño (vhost o director), por lo que debe hacer algo en cada niño.
Si solo intentas reescribir algo en el dominio parte del nombre, por ejemplo, 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.
Como esto utiliza redirecciones, 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>
Siempre he usado un VHost "catch-all" para 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 funcionar ... los registros de errores se combinaban correctamente, etc. ... pero es posible que este fuera el resultado de una directiva anterior / conflictiva / similar.
Nota personal ... Quien haya ideado el esquema de configuración de Apache y su sintaxis era un dingbat, o un grupo de dingbats, que pasaba demasiado tiempo en su cueva ... ¡Todo el asunto debería ser exorcizado y XMLizado, o algo así! A pesar de que ambos son muy diferentes ... el proceso de instalación de Hello-Kitty de Cherokee ... a la configuración brutalmente sucinta de NGinx ... son ambos mucho más lógicos ...
Especifique RewriteOptions InheritDown
en el ámbito primario (como httpd.conf) para aplicar sus reglas en los Hosts Virtuales secundarios sin modificarlos.
Esto solo funcionará en Hosts Virtuales donde la directiva RewriteEngine
está RewriteEngine
:
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.
( fuente )
Apache admite esto desde 2.4.8 (no disponible en el momento de la pregunta original).
De la documentación para RewriteOptions
:
InheritDown
Si esta opción está habilitada, todas las configuraciones secundarias heredarán 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 alcance actual se aplican antes de las reglas especificadas en el ámbito de cualquier niño. Disponible en Apache HTTP Server 2.4.8 y posterior.
IgnorarInherit
Esta opción fuerza a las configuraciones actuales e inferiores a ignorar todas las reglas que se heredarían de un elemento primario que especifique InheritDown o InheritDownBefore. Disponible en Apache HTTP Server 2.4.8 y posterior.
( http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions )