apache - ¿Cómo puedo tener un bloque condicional.htaccess?
apache2 (4)
Esta es una pregunta de Apache que probablemente hayas encontrado antes. Quiero tener un paquete fuente que pueda implementar en mi estación de trabajo, mi servidor de pruebas y mi servidor de producción, pero para que cargue diferentes configuraciones de .htaccess según la URL.
Tenga en cuenta que estaba usando un kludge con una llamada de IfModule, pero eso no funcionará con nuestro nuevo servidor de producción porque comparte todos los mismos módulos que mi servidor de prueba.
Tenga en cuenta que necesito agrupar SetEnv con estas reescrituras. Actualmente, si utiliza RewriteCond, solo se vincula con la siguiente RewriteRule, pero no con SetEnv debajo.
Aquí hay un ejemplo simple que debería ser suficiente para que pueda cambiarlo y cumplir con 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>
En lugar de usar SetEnv, use las capacidades de configuración de variables de entorno de RewriteRule:
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 al pasar banderas al proceso httpd en el inicio y buscarlas utilizando los bloques IfDefine.
<IfDefine FOO>
SetEnv VARNAME foo
</IfDefine>
<IfDefine BAR>
SetEnv VARNAME bar
</IfDefine>
IfDefine
método IfDefine
y no funcionó, a pesar de que la variable definida que había pasado a la inicialización de Apache definitivamente se mostraba en phpinfo()
en la línea APACHE_ARGUMENTS
.
Probé otro método y funcionó perfectamente. En tu archivo .htaccess
necesitas algo como:
# Is the domain local (i wanted to check two names)? <If "%{SERVER_NAME} != ''localhost'' && %{SERVER_NAME} != ''myproject.localhost''"> # I wanted to password protect the production server only AuthType Basic AuthName "Restricted area" AuthUserFile /app/.htpasswd require valid-user </If>
Estoy usando Apache 2.4. Podría no funcionar para versiones anteriores.
En Ubuntu Linux , la variable de IfDefine
está configurada en
/etc/apache2/envvars
y se llama APACHE_ARGUMENTS
. Entonces, al final de ese archivo tuve que agregar:
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 esto here . En ese ejemplo, el archivo a 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 haciendo un whereis apache2ctl
para encontrar dónde está ese script, whereis apache2ctl
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 experimentando con /etc/sysconfig/httpd
, /etc/default/apache2
, o /etc/apache2/envvars
.