Bagaimana cara memeriksa apakah mod_rewrite diaktifkan di php?

149

Saya bertanya-tanya apakah mungkin untuk memeriksa apakah mod_rewritediaktifkan pada Apache DAN IIS di PHP.

ModRewrite untuk IIS ada. Lihat itu here.

Jadi, saya sedang mencari script PHP yang memeriksa mod_rewritepada Apache dan IIS.

Adakah yang tahu skrip seperti itu atau dapat menulisnya?

Khusus untuk Microsoft IIS .

Terima kasih!

Dasi
sumber

Jawaban:

125

Jika Anda menggunakan mod_php, Anda dapat menggunakan apache_get_modules(). Ini akan mengembalikan array dari semua modul yang diaktifkan, jadi untuk memeriksa apakah mod_rewritediaktifkan, Anda bisa melakukannya

in_array('mod_rewrite', apache_get_modules());

Sayangnya, Anda kemungkinan besar mencoba melakukan ini dengan CGI, yang membuatnya sedikit lebih sulit.

Anda dapat mengujinya menggunakan yang berikut ini

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

Jika kondisi di atas dievaluasi true, maka mod_writediaktifkan.

kba
sumber
1
Saya tidak tahu Ini menguji apakah modul mod_rewriteterpasang. The IIS Mod-Rewrite modul Anda mungkin maksudkan adalah produk yang sama sekali berbeda dan komersial - tidak memiliki hubungan dengan modul Apache, itu pertanyaan yang sama sekali berbeda dan saya tidak punya pengalaman menggunakannya.
kba
Itu benar, jadi tidak ada script umum yang benar?
Dasi
@DrCord Lalu saya kira Anda menggunakannya di CGI.
kba
tidak, menggunakannya dalam skrip php seperti jawaban dan jawaban di bawah ini. if (! function_exists ('apache_get_modules')) {phpinfo (); mati; } selalu benar di server saya ...
DrCord
2
@Gerep phpinfo()dapat berguna untuk banyak hal, tetapi jika Anda ingin menulis sistem yang digunakan mod_rewritejika itu diaktifkan atau mundur ke beberapa perilaku lain, akan berguna untuk mendeteksinya secara terprogram.
kba
94

Salin bagian kode ini dan jalankan untuk mencari tahu.


<?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
sumber
Akankah phpinfo juga memberi tahu saya jika saya tidak mengaktifkan mod_php?
Owen McAlack
2
ya kita bisa lihat di phpinfo.php semua "Modul yang Dimuat" Apche
Mohini
52

Saya suka solusi 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>

Kemudian, Anda dapat memeriksa kode PHP Anda untuk

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Tidak tahu apakah ini bekerja juga dengan IIS (saya tidak punya cara untuk memeriksa) tetapi kemungkinannya bagus.

bir
sumber
4
Dengan <IfModule mod_env.c>itu akan hampir sempurna. :)
RibeiroBreno
Ini adalah solusi yang sangat berguna dan sederhana dan bekerja bahkan jika PHP berjalan sebagai CGI
Jose B
seperti yang disebutkan @RibeiroBreno, dengan <IfModule mod_env.c> akan hampir sempurna. ini bekerja untuk saya dengan sempurna.
Kassem
Jika PHP berjalan sebagai CGI, inilah caranya. Bekerja dengan indah.
Wojciech Jakubas
35

Unggah file bernama info.php dengan kode ini dan jalankan:

<?php 
phpinfo();

Cari mod_rewrite pada halaman, dan lihat apakah Anda dapat menemukannya di bawah Modul Dimuat.

Johnny Jensen
sumber
28

jangan membuatnya begitu sulit sehingga Anda bisa menemukannya phpinfo();

masukkan deskripsi gambar di sini

Semoga bermanfaat!

Terima kasih

loyola
sumber
Ini adalah rute tercepat dan paling sederhana bagi saya, karena saya sudah melakukan hal-hal dengan panggilan / file phpinfo. Terima kasih! :)
Brian U
@loyola, saya tidak dapat memperbarui komentar saya, jadi saya menghapus, terima kasih
vanduc1102
11

via command line kita dalam centOs kita bisa melakukan ini

httpd -l
h0mayun
sumber
1
Dan jika Anda berada di ubuntu: apache2 -l
youanden
2
Atau apachectl -M di Ubuntu juga
Batandwa
Ini sepertinya hanya memperlihatkan modul yang dikompilasi masuk.
jayarjo
2
httpd -M menunjukkan daftar modul Statis dan Bersama yang dimuat.
jayarjo
7
<?php
phpinfo();
?>

Lihat di bawah Konfigurasi di apache2handler di baris Modul Dimuat.

Ini sederhana dan berhasil.

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

Ini adalah metode saya saat ini untuk memeriksa apakah Mod_rewrite diaktifkan untuk Apache dan 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);

Ini bekerja di mesin lokal saya dan juga bekerja di hosting berbasis IIS saya. Namun, pada server apache tertentu, itu tidak berfungsi untuk Apache karena apache_get_modules () dinonaktifkan tetapi mod_rewrite diaktifkan di server itu.

Ahmedul Haque Abid
sumber
3

Anda bisa mendapatkan daftar modul apache yang terpasang , dan memeriksanya. Mungkin Anda dapat memeriksa apakah sudah diinstal dengan mencari file .dll (atau yang setara dengan linux).

TJHeuvel
sumber
@kba Cara memeriksa lalu dalam mode CGI.
ravisoni
3

Dua baris kode:

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

Satu lagi metode melalui exec().

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

Jika mod_rewritedimuat itu akan mengembalikan "rewrite_module" di output.

Abhishek Gurjar
sumber
0

Gagasan lain, memang lebih merupakan hack kotor, mengenai mod rewrite adalah server dependend dan tidak perlu masalah php: Mengapa tidak, jika Anda memiliki kemungkinan, buat direktori uji letakkan .htaccess di dalamnya penulisan ulang untuk test.php, panggil direktori via http dan periksa apakah Anda mendapatkan hasil yang diharapkan Anda masukkan ke test.php.

Memang kotor.

webfan
sumber
0

Gunakan fungsi ini:

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

Bagaimana kalau membuat redirect ke file yang dikenal dan kemudian memeriksa apakah redirect itu benar-benar berfungsi dengan curl?

rosell.dk
sumber
0

Untuk pahlawan dan pahlawan IIS:

Tidak perlu mencari mod_rewrite. Cukup instal modul Rewrite 2 lalu impor file .htaccess .

Shadi Namrouti
sumber