Jak sprawdzić, czy mod_rewrite jest włączony w PHP?

149

Zastanawiałem się, czy można sprawdzić, czy mod_rewritejest włączona na Apache I IIS w PHP.

Istnieje ModRewrite dla usług IIS. Sprawdź to here.

Więc szukam skryptu PHP, który sprawdza mod_rewritesię na Apache i IIS.

Czy ktoś zna taki skrypt lub może go napisać?

Specjalnie dla Microsoft IIS .

Dzięki!

Krawaty
źródło

Odpowiedzi:

125

Jeśli używasz mod_php, możesz użyć apache_get_modules(). To zwróci tablicę wszystkich włączonych modułów, więc aby sprawdzić, czy mod_rewritejest włączona, możesz po prostu to zrobić

in_array('mod_rewrite', apache_get_modules());

Niestety, najprawdopodobniej próbujesz to zrobić za pomocą CGI, co sprawia, że ​​jest to trochę trudniejsze.

Możesz to jednak przetestować, korzystając z poniższego

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

Jeśli wynikiem powyższego warunku jest true, to mod_writejest włączone.

kba
źródło
1
Nie wiem Ten test sprawdza, czy moduł mod_rewritejest zainstalowany. Moduł IIS Mod-Rewrite , o którym prawdopodobnie mówisz, jest zupełnie innym i komercyjnym produktem - nie ma związku z modułem Apache, to zupełnie inne pytanie i nie mam doświadczenia w jego używaniu.
kba
To prawda, więc właściwie nie ma ogólnego scenariusza?
Remis
@DrCord Zgaduję, że używasz go w CGI.
kba
nie, użyłem go w skrypcie php, tak jak odpowiedź i odpowiedź poniżej. if (! function_exists ('apache_get_modules')) {phpinfo (); umierać; } zawsze jest prawdą na moim serwerze ...
DrCord,
2
@Gerep phpinfo()może być przydatny do wielu rzeczy, ale jeśli chcesz napisać system, który używa, mod_rewritejeśli jest włączony, lub w inny sposób odwraca się do innego zachowania, warto to wykryć programowo.
kba
94

Skopiuj ten fragment kodu i uruchom go, aby się dowiedzieć.


<?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
źródło
Czy phpinfo powie mi również, czy nie mam włączonego mod_php?
Owen McAlack
2
tak, możemy zobaczyć w phpinfo.php wszystkie "załadowane moduły" Apche
Mohini
52

Podoba mi się rozwiązanie Christiana Roya :

###  .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>

Następnie możesz sprawdzić w swoim kodzie PHP

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Nie mam pojęcia, czy działa to również z IIS (nie mam możliwości sprawdzenia), ale szanse są dobre.

ale
źródło
4
Z <IfModule mod_env.c>tym byłoby prawie idealne. :)
RibeiroBreno
Jest to bardzo przydatne i proste rozwiązanie, które działa nawet jeśli PHP działa jako CGI
Jose B
jak wspomniał @RibeiroBreno, z <IfModule mod_env.c> byłoby prawie idealnie. to działało dla mnie idealnie.
Kassem
Jeśli PHP działa jako CGI, to jest droga. Działa pięknie.
Wojciech Jakubas
35

Prześlij plik o nazwie info.php z tym kodem i uruchom go:

<?php 
phpinfo();

Wyszukaj mod_rewrite na stronie i sprawdź, czy możesz go znaleźć w sekcji Loaded Modules.

Johnny Jensen
źródło
28

nie utrudniaj tego tak, że możesz po prostu znaleźć phpinfo();

wprowadź opis obrazu tutaj

Mam nadzieję, że pomocna!

Dzięki

loyola
źródło
To była dla mnie najszybsza i najłatwiejsza droga, ponieważ już robiłem rzeczy z wywołaniem / plikiem phpinfo. Dzięki! :)
Brian U
@loyola, nie mogę zaktualizować komentarza, więc
usunąłem
11

za pomocą wiersza poleceń możemy to zrobić w centOs

httpd -l
h0mayun
źródło
1
A jeśli jesteś na ubuntu: apache2 -l
youanden
2
Lub apachectl -M również w Ubuntu
Batandwa
Wydaje się, że pokazuje tylko moduły, które zostały skompilowane.
jayarjo
2
httpd -M pokazuje listę załadowanych modułów statycznych i współdzielonych.
jayarjo
7
<?php
phpinfo();
?>

Zajrzyj do sekcji Konfiguracja w apache2handler w wierszu Loaded Modules.

To jest proste i działa.

<?php foreach( apache_get_modules() as $module ) echo "$module<br />";  ?>
user1649798
źródło
7

To jest moja obecna metoda sprawdzania, czy Mod_rewrite jest włączony zarówno dla Apache, jak i 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);

Działa na moim komputerze lokalnym, a także na moim hoście internetowym opartym na IIS. Jednak na konkretnym serwerze Apache nie działało to dla Apache, ponieważ apache_get_modules () była wyłączona, ale mod_rewrite był włączony na tym serwerze.

Ahmedul Haque Abid
źródło
3

Możesz uzyskać listę zainstalowanych modułów Apache i sprawdzić ją. Być może możesz sprawdzić, czy jest zainstalowany, wyszukując jego plik .dll (lub odpowiednik systemu Linux).

TJHeuvel
źródło
@kba Jak sprawdzić, czy to w trybie CGI.
ravisoni
3

Dwie linie kodu:

$isEnabled = in_array('mod_rewrite', apache_get_modules());
echo ($isEnabled) ? 'Enabled' : 'Not enabled';
Amal Murali
źródło
1

Jeszcze jedna metoda exec().

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

Jeśli mod_rewritejest załadowany, na wyjściu zwróci "rewrite_module".

Abhishek Gurjar
źródło
0

Innym pomysłem, w istocie bardziej brudnym hackem, dotyczącym przepisywania modów jest zależność od serwera i niepotrzebny problem z php: Dlaczego nie, jeśli masz taką możliwość, stwórz katalog testowy, umieść w nim .htaccess, przepisując do test.php, wywołaj katalog przez http i sprawdź, czy otrzymujesz oczekiwany wynik, który umieściłeś w test.php.

Rzeczywiście, brudny.

webfan
źródło
0

Użyj tej funkcji:

function apache_module_exists($module)
{
    return in_array($module, apache_get_modules());
}
czarny
źródło
0

Co powiesz na przekierowanie do znanego pliku, a następnie sprawdzenie, czy to przekierowanie faktycznie działa z curl?

rosell.dk
źródło
0

Dla bohaterów i heroin IIS:

Nie musisz szukać mod_rewrite. Wystarczy zainstalować moduł Rewrite 2 , a następnie zaimportować pliki .htaccess .

Shadi Namrouti
źródło