Come verificare se mod_rewrite è abilitato in php?


149

Mi chiedevo se è possibile verificare se mod_rewriteè abilitato su Apache AND IIS in PHP.

ModRewrite per IIS esiste. Controllare here.

Quindi, sto cercando uno script PHP che controlli mod_rewritesu Apache e IIS.

Qualcuno conosce un tale script o può scriverne uno?

Soprattutto per Microsoft IIS .

Grazie!

Risposte:


125

Se stai usando mod_php, puoi usare apache_get_modules(). Questo restituirà un array di tutti i moduli abilitati, quindi per verificare se mod_rewriteè abilitato, puoi semplicemente farlo

in_array('mod_rewrite', apache_get_modules());

Sfortunatamente, molto probabilmente stai provando a farlo con CGI, il che rende un po 'più difficile.

Puoi testarlo usando quanto segue, comunque

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

Se la condizione di cui sopra viene valutata true, mod_writeviene abilitata.


1
Non lo so. Questo verifica se il modulo mod_rewriteè installato. Il modulo IIS Mod-Rewrite a cui probabilmente ti riferisci è un prodotto completamente diverso e commerciale: non ha alcuna associazione con il modulo Apache, è una domanda completamente diversa e non ho esperienza nell'usarlo.
kba,

È vero, quindi non c'è propriamente una sceneggiatura generale?
Lega il

@DrCord Quindi suppongo che lo stai usando in CGI.
kba,

no, lo stava usando in uno script php proprio come la risposta e la risposta qui sotto. if (! function_exists ('apache_get_modules')) {phpinfo (); morire; } è sempre vero sul mio server ...
DrCord

2
@Gerep phpinfo()può essere utile per molte cose, ma se vuoi scrivere un sistema che usa mod_rewritese è abilitato o altrimenti fallback ad altri comportamenti, può essere utile rilevarlo a livello di codice.
kba,

94

Copia questo pezzo di codice ed eseguilo per scoprirlo.


<?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>

Phpinfo mi dirà anche se non ho abilitato mod_php?
Owen McAlack,

2
si possiamo vedere in phpinfo.php tutti i "moduli caricati" di Apche
Mohini,

52

Mi piace la soluzione di 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>

Quindi, puoi controllare il tuo codice PHP per

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Non ho idea se questo funziona anche con IIS (non ho modo di controllare) ma le probabilità sono buone.


4
Con un <IfModule mod_env.c>sarebbe quasi perfetto. :)
RibeiroBreno

Questa è una soluzione molto utile e semplice e funziona anche se PHP è in esecuzione come CGI
Jose B

come menzionato @RibeiroBreno, con <IfModule mod_env.c> sarebbe quasi perfetto. questo ha funzionato perfettamente per me.
Kassem,

Se PHP funziona come CGI, questa è la strada da percorrere. Funziona magnificamente.
Wojciech Jakubas,

35

Carica un file chiamato info.php con questo codice ed eseguilo:

<?php 
phpinfo();

Cerca mod_rewrite nella pagina e vedi se lo trovi in ​​Moduli caricati.


28

non renderlo così difficile che puoi semplicemente trovare phpinfo();

inserisci qui la descrizione dell'immagine

Spero utile!

Grazie


Questo è stato il percorso più rapido e semplice per me, dato che stavo già facendo cose con una chiamata / file phpinfo. Grazie! :)
Brian U

@loyola, non riesco ad aggiornare il mio commento, quindi ho eliminato, grazie
vanduc1102

11

tramite la riga di comando in centOs possiamo farlo

httpd -l

1
E se sei su Ubuntu: apache2 -l
youanden,

2
O apachectl -M anche su Ubuntu
Batandwa il

Questo sembra mostrare solo i moduli che sono stati compilati.
jayarjo,

2
httpd -M mostra l'elenco dei moduli statici e condivisi caricati.
jayarjo,

7
<?php
phpinfo();
?>

Cerca in Configurazione in apache2handler nella riga Moduli caricati.

Questo è semplice e funziona.

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

7

Questo è il mio metodo attuale per verificare se Mod_rewrite è abilitato sia per Apache che per 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);

Funziona nel mio computer locale e ha funzionato anche nel mio webhost basato su IIS. Tuttavia, su un particolare server apache, non ha funzionato per Apache poiché apache_get_modules () era disabilitato ma mod_rewrite era abilitato in quel server.


3

È possibile ottenere un elenco di moduli apache installati e verificarlo. Forse puoi verificare se è installato cercando il suo file .dll (o Linux equivalente).


@kba Come verificare quindi in modalità CGI.
Ravisoni,

3

Due righe di codice:

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

1

Un altro metodo attraverso exec().

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

Se mod_rewriteviene caricato, restituirà "rewrite_module" nell'output.


0

Un'altra idea, anzi più un hack sporco, per quanto riguarda la riscrittura delle mod è che il server dipende da un problema php non necessario: perché no, se hai la possibilità, crea una directory di prova inserisci un .htaccess riscrivendolo in test.php, chiama la directory tramite http e controlla se ottieni il risultato atteso che hai inserito in test.php.

Anzi, sporco.


0

Usa questa funzione:

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

0

Che ne dici di fare un reindirizzamento su un file noto e poi verificare se quel reindirizzamento funziona davvero con il ricciolo?


0

Per eroi ed eroine di IIS:

Non c'è bisogno di cercare mod_rewrite. Basta installare il modulo Rewrite 2 e quindi importare i file .htaccess .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.