2009-04-10 9 views
15

Esta es una pregunta de Apache con la que probablemente te hayas cruzado antes. Quiero tener un paquete de origen que pueda implementar en mi estación de trabajo, mi servidor de transición y mi servidor de producción, pero para que cargue diferentes configuraciones de .htaccess basadas en lo que era la URL.¿Cómo puedo tener un bloque de htaccess condicional?

Tenga en cuenta que estaba usando un kludge con una llamada IfModule, pero eso no funcionará con nuestro nuevo servidor de producción porque comparte todos los mismos módulos que mi servidor de transferencia.

Nota Necesito agrupar SetEnv con estas reescrituras. Actualmente, si usa RewriteCond, solo se relaciona con la siguiente RewriteRule, pero no con SetEnv debajo.

Respuesta

15

En lugar de utilizar SetEnv, utiliza las capacidades entorno de ajuste variable del RewriteRule sí:

RewriteCond %{HTTP_HOST} =foo.com 
RewriteRule^- [E=VARNAME:foo] 

RewriteCond %{HTTP_HOST} =bar.com 
RewriteRule^- [E=VARNAME:bar] 

Aunque prefiero hacer este tipo de cosas pasando banderas al proceso httpd al inicio y buscándolas usando bloques IfDefine.

<IfDefine FOO> 
SetEnv VARNAME foo 
</IfDefine> 

<IfDefine BAR> 
SetEnv VARNAME bar 
</IfDefine> 
+0

Cabe señalar que la directiva php_value en Apache no se puede llamar en el primer ejemplo, solo las variables de entorno. En el segundo ejemplo, esta es la mejor opción porque puedes literalmente definir tu servidor. Sin embargo, esto solo funciona si controlas el entorno. Si está en un host compartido, no tiene forma de controlar pasar un parámetro al proceso httpd. Por lo tanto, busca lo contrario de esto con . –

+1

Encontré que puedo usar IfDefine porque mi servidor de prod es 100% controlado por mí y puedo meterme con el parámetro OPTION/etc/sysconfig/httpd y hacer que OPTIONS = "- D prod". En el servidor intermedio, que es compartido, tuve que usar IfDefine! Prod y luego apilar un ifModule expires_module debajo de él. En mi estación de trabajo, tuve que usar IfDefine! Prod seguido de IfModule! Expires_module. Esto me dio un archivo .htaccess que funcionaba en desarrollo, montaje/prueba y producción. –

+0

Un poco confuso, me hizo pensar que las variables simples del entorno podrían usarse en ifdefine – Dan

1

Aquí está un ejemplo simple que debe ser suficiente para que usted cambie para satisfacer sus requisitos:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteBase/

    RewriteCond %{HTTP_HOST} !^localhost 
    RewriteCond %{HTTP_HOST} !^www\. 
    RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L] 
</IfModule> 
+0

¿Funciona en serie, donde puedo agregar otra RewriteCond debajo con más entradas RewriteRule, y solo se aplicará a RewriteCond anterior? Quiero decir, en los lenguajes de programación normales y el marcado tienes algún tipo de bloque de inicio/detención, ya sean llaves. Pero no aquí –

+0

Además, ¿es RewriteBase/importante? –

+0

El problema con este enfoque es que solo funciona para RewriteRule, intente y también utilícelo para SetEnv o php_value y no funciona. Es por eso que utilicé el Iflodule kludge. –

5

En Ubuntu Linux, la variable IfDefine 's se encuentra en

/etc/apache2/envvars 

y se llama APACHE_ARGUMENTS. Así, en la parte inferior de ese archivo que he tenido que añadir:

export APACHE_ARGUMENTS="-D dev" 

... y luego rebotar el servidor con:

/etc/init.d/apache2 stop 
/etc/init.d/apache2 start 

En otros sistemas:

Sin embargo, hay un artículo de Debian sobre este tema que trata este here. En ese ejemplo, el archivo para editar es/etc/default/apache2 y la variable se llama APACHE_DEFINES.

Del mismo modo, en algunos sistemas es una variable llamada OPTIONS que se establece en /etc/sysconfig/httpd.

Entonces, lo que realmente necesita hacer es buscar la sección de inicio en su archivo apache2ctl. Entonces, comience por hacer un whereis apache2ctl para encontrar dónde está ese script, agárralo y encuentre la sección de inicio con la directiva apache2 en él, y vea si la variable que pasa es OPTIONS, APACHE_ARGUMENTS, APACHE_DEFINES, o alguna otra cosa. Luego, vea qué archivo necesita editar mediante experimentación con /etc/sysconfig/httpd, /etc/default/apache2 o /etc/apache2/envvars.

Cuestiones relacionadas