¿Cómo verificar si mod_rewrite está habilitado en php?

149

Me preguntaba si es posible verificar si mod_rewriteestá habilitado en Apache y IIS en PHP.

ModRewrite para IIS existe. Comprobarlo here.

Entonces, estoy buscando un script PHP que verifique mod_rewriteen Apache e IIS.

¿Alguien sabe tal guión o puede escribir uno?

Especialmente para Microsoft IIS .

¡Gracias!

Corbatas
fuente

Respuestas:

125

Si está usando mod_php, puede usar apache_get_modules(). Esto devolverá una matriz de todos los módulos habilitados, por lo que para verificar si mod_rewriteestá habilitado, simplemente puede hacer

in_array('mod_rewrite', apache_get_modules());

Desafortunadamente, lo más probable es que intentes hacer esto con CGI, lo que lo hace un poco más difícil.

Sin embargo, puedes probarlo usando lo siguiente

strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_rewrite') !== false

Si la condición anterior se evalúa como true, entonces mod_writeestá habilitada.

kba
fuente
1
No lo sé. Esto prueba si el módulo mod_rewriteestá instalado. El módulo IIS Mod-Rewrite al que probablemente te refieres es un producto completamente diferente y comercial: no tiene asociación con el módulo Apache, es una pregunta completamente diferente y no tengo experiencia en usarlo.
kba
Eso es cierto, ¿entonces no hay un script general?
Corbatas
@DrCord Entonces supongo que lo estás usando en CGI.
kba
no, lo estaba usando en un script php al igual que la respuesta y la respuesta a continuación. if (! function_exists ('apache_get_modules')) {phpinfo (); morir; } siempre es cierto en mi servidor ...
DrCord
2
@Gerep phpinfo()puede ser útil para muchas cosas, pero si desea escribir un sistema que lo use mod_rewritesi está habilitado o si tiene algún otro comportamiento, puede ser útil detectarlo mediante programación.
kba
94

Copie este fragmento de código y ejecútelo para averiguarlo.


<?php
 if(!function_exists('apache_get_modules') ){ phpinfo(); exit; }
 $res = 'Module Unavailable';
 if(in_array('mod_rewrite',apache_get_modules())) 
 $res = 'Module Available';
?>
<html>
<head>
<title>A mod_rewrite availability check !</title></head>
<body>
<p><?php echo apache_get_version(),"</p><p>mod_rewrite $res"; ?></p>
</body>
</html>
Shankar Damodaran
fuente
¿Phpinfo también me dirá si no tengo habilitado mod_php?
Owen McAlack el
2
sí, podemos ver en phpinfo.php todos los "módulos cargados" de Apche
Mohini
52

Me gusta la solución de Christian Roy :

###  .htaccess

<IfModule mod_rewrite.c>

    # Tell PHP that the mod_rewrite module is ENABLED.
    SetEnv HTTP_MOD_REWRITE On

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # The rest of your rewrite rules here

</IfModule>

Luego, puede verificar su código PHP para

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

No tengo idea si esto también funciona con IIS (no tengo forma de verificarlo) pero las probabilidades son buenas

cerveza inglesa
fuente
44
Con un <IfModule mod_env.c>sería casi perfecto. :)
RibeiroBreno
Esta es una solución muy útil y simple y funciona incluso si PHP se ejecuta como CGI
Jose B
como mencionó @RibeiroBreno, con <IfModule mod_env.c> sería casi perfecto. Esto me funcionó perfectamente.
Kassem
Si PHP se ejecuta como CGI, este es el camino a seguir. Funciona muy bien
Wojciech Jakubas
35

Cargue un archivo llamado info.php con este código y ejecútelo:

<?php 
phpinfo();

Busque mod_rewrite en la página y vea si puede encontrarlo en Módulos cargados.

Johnny Jensen
fuente
28

no lo hagas tan difícil que simplemente puedas encontrar en phpinfo();

ingrese la descripción de la imagen aquí

Espero que sea útil!

Gracias

loyola
fuente
Esta fue la ruta más rápida y sencilla para mí, ya que ya estaba haciendo cosas con una llamada / archivo phpinfo. ¡Gracias! :)
Brian U
@loyola, no puedo actualizar mi comentario, así que lo
eliminé
11

a través de la línea de comando, en centOs podemos hacer esto

httpd -l
h0mayun
fuente
1
Y si estás en ubuntu: apache2 -l
youanden
2
O apachectl -M en Ubuntu también
Batandwa
Esto parece mostrar solo los módulos que fueron compilados.
Jayarjo
2
httpd -M muestra la lista de módulos estáticos y compartidos cargados.
jayarjo
7
<?php
phpinfo();
?>

Busque en Configuración en el controlador apache2 en la fila Módulos cargados.

Esto es simple y funciona.

<?php foreach( apache_get_modules() as $module ) echo "$module<br />";  ?>
usuario1649798
fuente
7

Este es mi método actual para verificar si Mod_rewrite está habilitado tanto para Apache como para IIS

/**
 * --------------------------------------------------------------
 *  MOD REWRITE CHECK
 * --------------------------------------------------------------
 *                                        - By A H Abid
 * Define Constant for MOD REWRITE
 * 
 * Check if server allows MOD REWRITE. Checks for both 
 * Apache and IIS.
 * 
 */
if( function_exists('apache_get_modules') && in_array('mod_rewrite',apache_get_modules()) )
    $mod_rewrite = TRUE;
elseif( isset($_SERVER['IIS_UrlRewriteModule']) )
    $mod_rewrite = TRUE;
else
    $mod_rewrite = FALSE;
define('MOD_REWRITE', $mod_rewrite);

Funciona en mi máquina local y también funcionó en mi webhost basado en IIS. Sin embargo, en un servidor apache en particular, no funcionó para Apache ya que apache_get_modules () estaba deshabilitado, pero mod_rewrite estaba habilitado en ese servidor.

Ahmedul Haque Abid
fuente
3

Puede obtener una lista de los módulos apache instalados y verificar eso. Quizás pueda verificar si está instalado buscando su archivo .dll (o equivalente de Linux).

TJHeuvel
fuente
@kba Cómo verificar luego en modo CGI.
ravisoni
3

Dos líneas de código:

$isEnabled = in_array('mod_rewrite', apache_get_modules());
echo ($isEnabled) ? 'Enabled' : 'Not enabled';
Amal Murali
fuente
1

Un método más a través exec().

exec('/usr/bin/httpd -M | find "rewrite_module"',$output);

Si mod_rewriteestá cargado, devolverá "rewrite_module" en la salida.

Abhishek Gurjar
fuente
0

Otra idea, más bien un truco sucio, con respecto a la reescritura de mods es la dependencia del servidor y no es necesario un problema de php: ¿por qué no, si tiene la posibilidad, crear un directorio de prueba? a través de http y verifique si obtiene el resultado esperado que puso en test.php.

De hecho, sucio.

webfan
fuente
0

Utiliza esta función:

function apache_module_exists($module)
{
    return in_array($module, apache_get_modules());
}
Negro
fuente
0

¿Qué tal hacer una redirección a un archivo conocido y luego verificar si esa redirección realmente funciona con curl?

rosell.dk
fuente
0

Para IIS héroes y heroínas:

No es necesario buscar mod_rewrite. Simplemente instale el módulo Rewrite 2 y luego importe los archivos .htaccess .

Shadi Namrouti
fuente