Comment vérifier si mod_rewrite est activé en php?

149

Je me demandais s'il est possible de vérifier si mod_rewriteest activé sur Apache ET IIS dans PHP.

ModRewrite pour IIS existe. Vérifiez-le here.

Donc, je recherche un script PHP qui vérifie mod_rewritesur Apache et IIS.

Quelqu'un connaît-il un tel script ou peut-il en écrire un?

Surtout pour Microsoft IIS .

Merci!

Cravates
la source

Réponses:

125

Si vous utilisez mod_php, vous pouvez utiliser apache_get_modules(). Cela renverra un tableau de tous les modules activés, donc pour vérifier si mod_rewriteest activé, vous pouvez simplement faire

in_array('mod_rewrite', apache_get_modules());

Malheureusement, vous essayez probablement de le faire avec CGI, ce qui rend les choses un peu plus difficiles.

Vous pouvez le tester en utilisant ce qui suit, cependant

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

Si les évalue condition ci - dessus pour true, puis mod_writeest activée.

kba
la source
1
Je ne sais pas. Cela teste si le module mod_rewriteest installé. Le module IIS Mod-Rewrite auquel vous faites probablement référence est un produit entièrement différent et commercial - il n'a aucune association avec le module Apache, c'est une question entièrement différente et je n'ai aucune expérience de son utilisation.
kba
C'est vrai, il n'y a donc pas de script général?
Cravates du
@DrCord Alors je suppose que vous l'utilisez en CGI.
kba
non, l'utilisait dans un script php, tout comme la réponse et la réponse ci-dessous. if (! function_exists ('apache_get_modules')) {phpinfo (); mourir; } est toujours vrai sur mon serveur ...
DrCord
2
@Gerep phpinfo()peut être utile pour beaucoup de choses, mais si vous voulez écrire un système qui utilise mod_rewrites'il est activé ou des solutions de secours à un autre comportement, il peut être utile de le détecter par programme.
kba
94

Copiez ce morceau de code et exécutez-le pour le découvrir.


<?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
la source
Est-ce que phpinfo me dira aussi si je n'ai pas activé mod_php?
Owen McAlack
2
oui on peut voir dans phpinfo.php tous les "modules chargés" d'Apche
Mohini
52

J'aime la solution 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>

Ensuite, vous pouvez vérifier votre code PHP pour

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Aucune idée si cela fonctionne également avec IIS (je n'ai aucun moyen de vérifier) ​​mais les chances sont bonnes.

ale
la source
4
Avec un <IfModule mod_env.c>ce serait presque parfait. :)
RibeiroBreno
C'est une solution très utile et simple et cela fonctionne même si PHP fonctionne en CGI
Jose B
comme @RibeiroBreno l'a mentionné, avec <IfModule mod_env.c> ce serait presque parfait. cela a parfaitement fonctionné pour moi.
Kassem
Si PHP fonctionne en tant que CGI, c'est la voie à suivre. Fonctionne à merveille.
Wojciech Jakubas
35

Téléchargez un fichier appelé info.php avec ce code et exécutez-le:

<?php 
phpinfo();

Recherchez mod_rewrite sur la page et voyez si vous pouvez le trouver sous Modules chargés.

Johnny Jensen
la source
28

ne rendez pas les choses si difficiles que vous pouvez simplement trouver dans phpinfo();

entrez la description de l'image ici

J'espère utile!

Merci

Loyola
la source
C'était la route la plus rapide et la plus simple pour moi, car je faisais déjà des choses avec un appel / fichier phpinfo. Merci! :)
Brian U
@loyola, je ne peux pas mettre à jour mon commentaire, alors j'ai supprimé, merci
vanduc1102
11

via la ligne de commande nous dans centOs nous pouvons le faire

httpd -l
h0mayun
la source
1
Et si vous êtes sur ubuntu: apache2 -l
youanden
2
Ou apachectl -M dans Ubuntu également
Batandwa
Cela semble ne montrer que les modules compilés en.
jayarjo
2
httpd -M affiche la liste des modules statiques et partagés chargés.
jayarjo
7
<?php
phpinfo();
?>

Regardez sous Configuration dans apache2handler dans la ligne Loaded Modules.

Ceci est simple et fonctionne.

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

C'est ma méthode actuelle pour vérifier si Mod_rewrite est activé pour Apache et 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);

Cela fonctionne dans ma machine locale et a également fonctionné dans mon hébergeur basé sur IIS. Cependant, sur un serveur Apache particulier, cela ne fonctionnait pas pour Apache car apache_get_modules () était désactivé mais le mod_rewrite était activé sur ce serveur.

Ahmedul Haque Abid
la source
3

Vous pouvez obtenir une liste des modules Apache installés et vérifier par rapport à cela. Vous pouvez peut-être vérifier s'il est installé en recherchant son fichier .dll (ou équivalent Linux).

TJHeuvel
la source
@kba Comment vérifier ensuite en mode CGI.
ravisoni
3

Deux lignes de code:

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

Une autre méthode à travers exec().

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

Si mod_rewriteest chargé, il retournera "rewrite_module" en sortie.

Abhishek Gurjar
la source
0

Une autre idée, en fait plus un sale hack, concernant la réécriture de mod est que le serveur dépend d'un problème php pas nécessaire: pourquoi pas, si vous en avez la possibilité, créez un répertoire de test, mettez un .htaccess dedans en réécrivant test.php, appelez le répertoire via http et vérifiez si vous obtenez le résultat attendu que vous avez mis dans test.php.

En effet, sale.

webfan
la source
0

Utilisez cette fonction:

function apache_module_exists($module)
{
    return in_array($module, apache_get_modules());
}
Noir
la source
0

Que diriez-vous de faire une redirection vers un fichier connu, puis de vérifier si cette redirection fonctionne réellement avec curl?

rosell.dk
la source
0

Pour les héros et héroïnes IIS:

Pas besoin de chercher mod_rewrite. Installez simplement le module Rewrite 2 , puis importez les fichiers .htaccess .

Shadi Namrouti
la source