2012-05-22 14 views
19

tl; dr: ¿Cómo puedo hacer lo siguiente en un archivo .htaccess o .conf:¿Detecta la versión de Apache en la configuración de apache?

<IfApache22> 
    # Do A 
</IfApache22> 
<IfApache24> 
    # Do B 
</IfApache24> 

más largo pregunta:

con Apache 2.4 del antiguo Order de conseguir utilizar para sustituirla por Require.

En mis archivos .htaccess que tienen

<FilesMatch "\.(long|list|file|types)$"> 
    Order allow,deny 
</FilesMatch> 

que significa Apache no se inicia a menos habilito access_compat. Al hacerlo presenta una solución útil, quiero una solución que funcione con ambas sintaxis ya que la configuración se distribuirá a muchos servidores. La pregunta es cómo puedo detectar la versión actual de Apache y aplicar la directiva correcta.

Tengo la intención de utilizar el archivo para un marco que se distribuye y utiliza por muchas personas, y no puedo controlar/garantizar que tienen o no tienen una configuración de servidor en particular, por lo que me gustaría el archivo es 2.2/2.4 "agnóstico".

Respuesta

2

Puede ejecutar diferentes versiones de Apache en el mismo host. P: ¿Qué pasa con los archivos de configuración separados en directorios separados? Creo sinceramente que es probablemente el método más limpio ...

Sin embargo, los archivos .conf de Apache permiten una <IfDefine>, que se puede especificar en tiempo de ejecución con "D":

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

+1

+1 para las opciones IfDefine y -D. Sin embargo, realmente no me ayuda. Ejecutar dos versiones del servidor web parece un montón de trabajo cuando un simple if/else debería ser capaz de resolverlo. ¿Puedes expandir "directorios separados" un poco más? Comprobar la versión actual me parece una solución muy agradable. Amplió un poco la pregunta sobre por qué. – Letharion

27

Un parche que he han utilizado.

# Apache 2.2 
<IfModule !mod_authz_core.c> 
    Satisfy Any 
</IfModule> 

# Apache 2.4 
<IfModule mod_authz_core.c> 
    Require all granted 
</IfModule> 
+1

... o si ese módulo está ausente en ambos extremos, pero su servidor local/de escenario es win (y Apache 2.x) y su live es linux (y Apache 2.y), verifique cualquier otra diferencia de módulo, es decir, '' –

+0

respuesta fantástica. Todo parece construir para 2.4, pero el mío es 2.2, ¡esto permite la compatibilidad futura! – Keith

1

Se podía pasar por alto la necesidad de conocer mediante el uso de mod_rewrite para su control de acceso:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$ 
RewriteRule .* - [F,L] 
14

Asumiendo que tiene mod_version instalados (muchas distribuciones enviarlo por defecto) se puede hacer lo siguiente:

<IfVersion >= 2.4> 
    # Require ... 
</IfVersion> 
<IfVersion < 2.4> 
    # Order ... 
    # Deny ... 
    # Allow ... 
</IfVersion> 
+3

Recomiendo esta respuesta. Si puede permitirse la dependencia adicional, este enfoque es mucho más claro. Además, si mod_authz_core alguna vez está deshabilitado al usar el enfoque en la respuesta aceptada, el archivo de configuración supondrá que se está ejecutando en 2.2 y continuará independientemente. La eliminación de mod_version aquí simplemente significará que el servidor se negará a comenzar. – seanhodges

1

Me encontré con este problema porque FallbackResource no está en las primeras versiones de Apache y, a menudo, las compañías de hosting inteligentes eliminan mod_rewrite una vez que tienen una versión de A pache con FallbackResource. Yo uso el siguiente .htaccess cuando quiero poner código de la biblioteca hasta que se adapta a su entorno:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule^- [E=protossl] 
    RewriteCond %{HTTPS} on 
    RewriteRule^- [E=protossl:s] 
    RewriteRule "(^|/)\." - [F] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 
    RewriteRule^index.php [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    FallbackResource index.php 
</IfModule> 

Ahora, por supuesto, hay algunas versiones/Apache configuraciones donde esto no funciona - pero si mod_rewrite está ahí, y lo utilizan si no, espero que FallbackResource esté allí.

Cuestiones relacionadas