Como verificar se o mod_rewrite está ativado no php?

149

Eu queria saber se é possível verificar se mod_rewriteestá ativado no Apache e IIS no WindowsPHP .

Existe ModRewrite para IIS. Verifique isso here.

Então, estou procurando um script PHP que verifique mod_rewriteno Apache e no IIS.

Alguém conhece esse script ou pode escrever um?

Especialmente para o Microsoft IIS .

Obrigado!

Laços
fonte

Respostas:

125

Se você estiver usando o mod_php, você pode usar apache_get_modules(). Isso retornará uma matriz de todos os módulos ativados; portanto, para verificar se mod_rewriteestá ativado, você pode simplesmente fazer

in_array('mod_rewrite', apache_get_modules());

Infelizmente, você provavelmente está tentando fazer isso com CGI, o que torna um pouco mais difícil.

Você pode testá-lo usando o seguinte, embora

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

Se a condição acima for avaliada como true, então mod_writeestá ativada.

kba
fonte
1
Eu não sei. Isso testa se o módulo mod_rewriteestá instalado. O módulo IIS Mod-Rewrite ao qual você provavelmente está se referindo é um produto totalmente diferente e comercial - ele não tem associação com o módulo Apache, é uma pergunta totalmente diferente e não tenho experiência em usá-lo.
kba
Isso é verdade, então não existe um script geral?
26612
@DrCord Então eu acho que você está usando em CGI.
kba
Não, estava usando-o em um script php, assim como a resposta e a resposta abaixo. if (! function_exists ('apache_get_modules')) {phpinfo (); morrer; } Sempre é verdade no meu servidor ...
DrCord
2
O @Gerep phpinfo()pode ser útil para muitas coisas, mas se você quiser escrever um sistema que use mod_rewritese estiver ativado ou de outra forma se sujeita a algum outro comportamento, será útil detectá-lo programaticamente.
kba
94

Copie este pedaço de código e execute-o para descobrir.


<?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
fonte
O phpinfo também me dirá se eu não tenho o mod_php ativado?
Owen McAlack
2
sim nós pode ver na phpinfo.php tudo de Apche "Loaded Modules"
Mohini
52

Gosto da solução 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>

Em seguida, você pode verificar seu código PHP para

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Não faço ideia se isso também funciona com o IIS (não tenho como verificar), mas as chances são boas.

cerveja
fonte
4
Com um <IfModule mod_env.c>, seria quase perfeito. :)
RibeiroBreno 02/02
Esta é uma solução muito útil e simples e funciona mesmo se o PHP está sendo executado como CGI
Jose B
como o @RibeiroBreno mencionou, com o <IfModule mod_env.c> seria quase perfeito. isso funcionou para mim perfeitamente.
precisa
Se o PHP estiver sendo executado como CGI, este é o caminho a percorrer. Funciona lindamente.
Wojciech Jakubas
35

Carregue um arquivo chamado info.php com este código e execute-o:

<?php 
phpinfo();

Procure mod_rewrite na página e veja se consegue encontrá-lo em Módulos carregados.

Johnny Jensen
fonte
28

não torne tão difícil que você pode simplesmente encontrar em phpinfo();

insira a descrição da imagem aqui

Espero que seja útil!

obrigado

loyola
fonte
Essa foi a rota mais rápida e simples para mim, já que eu já estava fazendo coisas com uma chamada / arquivo phpinfo. Obrigado! :)
Brian L
@loyola, eu não posso atualizar meu comentário, então eu deletei, obrigado
vanduc1102
11

via linha de comando nós, em centOs, podemos fazer isso

httpd -l
h0mayun
fonte
1
E se você estiver no ubuntu: apache2 -l
youanden 4/04
2
Ou apachectl -M no Ubuntu bem
Batandwa
Isso parece mostrar apenas os módulos que foram compilados em.
jayarjo
2
httpd -M mostra a lista de módulos estáticos e compartilhados carregados.
Jayarjo 18/05
7
<?php
phpinfo();
?>

Procure em Configuração no apache2handler na linha Módulos Carregados.

Isso é simples e funciona.

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

Este é o meu método atual de verificar se o Mod_rewrite está ativado para o Apache e o 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);

Ele funciona na minha máquina local e também funcionou no meu host da Web baseado no IIS. No entanto, em um servidor apache específico, ele não funcionou para o Apache, pois o apache_get_modules () foi desativado, mas o mod_rewrite foi ativado nesse servidor.

Ahmedul Haque Abid
fonte
3

Você pode obter uma lista dos módulos apache instalados e verificar isso. Talvez você possa verificar se está instalado pesquisando seu arquivo .dll (ou equivalente ao Linux).

TJHeuvel
fonte
@kba Como verificar o modo CGI.
ravisoni
3

Duas linhas de código:

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

Mais um método exec().

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

Se mod_rewriteestiver carregado, retornará "rewrite_module" na saída.

Abhishek Gurjar
fonte
0

Outra idéia, na verdade um truque sujo, sobre a reescrita de mod é o servidor dependente e não é necessário um problema de php: por que não, se você tiver a possibilidade, crie um diretório de teste e coloque um .htaccess reescrevendo para test.php, chame o diretório via http e verifique se você obtém o resultado esperado que você colocou em test.php.

De fato, sujo.

webfan
fonte
0

Use esta função:

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

Que tal fazer um redirecionamento para um arquivo conhecido e verificar se esse redirecionamento realmente funciona com curl?

rosell.dk
fonte
0

Para heróis e heroínas do IIS:

Não há necessidade de procurar mod_rewrite. Basta instalar o módulo Rewrite 2 e importar arquivos .htaccess .

Shadi Namrouti
fonte