¿Cómo debo usar la directiva <If> en .htaccess?

16

Estoy tratando de agregar una declaración condicional usando la directiva If de Apache en mi archivo .htaccess.

Me he referido a esta página http://httpd.apache.org/docs/trunk/mod/core.html#if pero no explica mucho / da muchos ejemplos. Dos ejemplos incompletos que da son:

<Si% {REQUEST_METHOD} EN OBTENER, CABEZA, OPCIONES> 

y

<If "$ req {Host} = ''"> 

Así que intenté agregar esto a mi archivo .htaccess:

<Si% {SERVER_PORT} EN GET, HEAD, OPTIONS>
   # nada aquí todavía
</If>

Pero sigo recibiendo el error 500 cuando intento cargar la página. Esto está en mi instalación local, y estaba funcionando bien anteriormente (o si elimino ese código). Creo que lo he AllowOverride Allconfigurado globalmente, y el contexto de la directiva If debería permitir que esté presente en .htaccess ("Contexto: configuración del servidor, host virtual, directorio, .htaccess").

¿Puede alguien darme algunos ejemplos de cómo usar correctamente la directiva <If>, o alguna orientación sobre por qué no funciona para mí?

¡Gracias!

cwd
fuente
1
Si obtiene un error 500, eso significa que Apache ha registrado algo en su registro de errores. ¿Qué dice? Además, su prueba para SERVER_PORTin GET,HEAD,OPTIONSno tiene ningún sentido ( SERVER_PORTva a ser el número de puerto en el que se recibió la solicitud).
larsks
Gracias, larsks. Parece que estoy ejecutando apache 2.0 que no es compatible con la directiva <If>. Tal vez necesito estudiar la actualización a 2.3. Al menos esto explica por qué no hay ejemplos en ninguna parte (b / c la característica es tan nueva). Gracias por el consejo.
cwd

Respuestas:

16

<If> solo está disponible en Apache 2.4+, así que primero asegúrate de tener esa versión.

Ejemplos

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Alternativas a <If>

Hay algunas otras soluciones para hacer declaraciones condicionales en Apache 2.2 si todavía está atascado con eso.

  • Puede establecer variables de entorno a través de:

    • Configuración de Apache
    • SetEnvIf
    • mod_rewrite RewriteMatch
  • Entonces puede realizar declaraciones condicionales usando

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Ejemplo:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
Simon East
fuente
1
Prueba pero no funciona! en el documento de apache, la <IfDefine>directiva solo se analiza al inicio y parameter-namesolo se puede pasar mediante una solicitud de comando usandohttpd -Dx=y
William Leung
Sus "Alternativas a If" estaban funcionando bien para mí, buen ejemplo.
Kyborek