Làm cách nào để kiểm tra xem mod_rewrite có được bật trong php không?


149

Tôi đã tự hỏi nếu có thể kiểm tra nếu mod_rewriteđược bật trên ApacheIIS trong PHP.

ModRewrite cho IIS tồn tại. Kiểm tra nó here.

Vì vậy, tôi đang tìm kiếm một tập lệnh PHP kiểm tra mod_rewritetrên ApacheIIS.

Có ai biết kịch bản như vậy hoặc có thể viết một?

Đặc biệt là đối với Microsoft IIS .

Cảm ơn!

Câu trả lời:


125

Nếu bạn đang sử dụng mod_php, bạn có thể sử dụng apache_get_modules(). Điều này sẽ trả về một mảng của tất cả các mô-đun được kích hoạt, vì vậy để kiểm tra xem có mod_rewriteđược bật hay không, bạn chỉ cần làm

in_array('mod_rewrite', apache_get_modules());

Thật không may, rất có thể bạn đang cố gắng làm điều này với CGI, điều này làm cho nó khó khăn hơn một chút.

Bạn có thể kiểm tra nó bằng cách sử dụng sau đây, mặc dù

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

Nếu điều kiện trên ước tính true, thì mod_writeđược bật.


1
Tôi không biết. Điều này kiểm tra nếu mô-đun mod_rewriteđược cài đặt. Các IIS Mod-Rewrite Module lẽ bạn đang đề cập đến là một sản phẩm hoàn toàn khác nhau và thương mại - nó không có liên kết với các module Apache, nó là một câu hỏi hoàn toàn khác nhau và tôi không có kinh nghiệm sử dụng nó.
kba

Điều đó đúng, vậy có đúng là không có kịch bản chung?
Ties

@DrCord Sau đó, tôi đoán bạn đang sử dụng nó trong CGI.
kba

Không, đã sử dụng nó trong một tập lệnh php giống như câu trả lời và câu trả lời dưới đây. if (! function_exists ('apache_get_modules')) {phpinfo (); chết; } luôn luôn đúng trên máy chủ của tôi ...
DrCord

2
@Gerep phpinfo()có thể hữu ích cho nhiều thứ, nhưng nếu bạn muốn viết một hệ thống sử dụng mod_rewritenếu nó được kích hoạt hoặc ngược lại với một số hành vi khác, sẽ rất hữu ích khi phát hiện ra nó theo lập trình.
kba

94

Sao chép đoạn mã này và chạy nó để tìm hiểu.


<?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 cũng sẽ cho tôi biết nếu tôi không kích hoạt mod_php chứ?
Owen McAlack

2
vâng, chúng ta có thể thấy trong phpinfo.php tất cả "Các mô-đun đã tải" của Apche
Mohini

52

Tôi thích giải pháp của 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>

Sau đó, bạn có thể kiểm tra mã PHP của mình cho

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Không biết nếu điều này cũng hoạt động với IIS (tôi không có cách nào để kiểm tra) nhưng tỷ lệ cược là tốt.


4
Với <IfModule mod_env.c>nó sẽ gần như hoàn hảo. :)
RibeiroBreno

Đây là một giải pháp rất hữu ích và đơn giản và nó hoạt động ngay cả khi PHP đang chạy dưới dạng CGI
Jose B

như @RibeiroBreno đã đề cập, với <IfModule mod_env.c> nó sẽ gần như hoàn hảo. Điều này làm việc cho tôi hoàn hảo.
Kassem

Nếu PHP đang chạy như CGI, đây là cách để đi. Hoạt động rất đẹp.
Wojciech Jakubas

35

Tải lên một tệp có tên là info.php với mã này và chạy nó:

<?php 
phpinfo();

Tìm kiếm mod_rewrite trên trang và xem bạn có thể tìm thấy nó trong Mô-đun đã tải không.


28

đừng làm nó quá khó bạn có thể tìm thấy phpinfo();

nhập mô tả hình ảnh ở đây

Hy vọng hữu ích!

Cảm ơn


Đây là con đường nhanh nhất và đơn giản nhất đối với tôi, vì tôi đã thực hiện công cụ với một cuộc gọi / tệp phpinfo. Cảm ơn! :)
Brian U

@loyola, tôi không thể cập nhật nhận xét của mình, vì vậy tôi đã xóa, cảm ơn
vanduc1102

11

thông qua dòng lệnh chúng tôi trong centO chúng tôi có thể làm điều này

httpd -l

1
Và nếu bạn đang ở trên Ubuntu: apache2 -l
youanden

2
Hoặc apachectl -M trong Ubuntu cũng vậy
Batandwa

Điều này dường như chỉ hiển thị các mô-đun được biên dịch trong.
jayarjo

2
httpd -M hiển thị danh sách các mô-đun Tĩnh và Chia sẻ được tải.
jayarjo

7
<?php
phpinfo();
?>

Xem bên dưới Cấu hình trong apache2handler trong hàng Mô-đun đã tải.

Điều này là đơn giản và làm việc.

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

7

Đây là phương pháp kiểm tra hiện tại của tôi nếu Mod_rewrite được bật cho cả Apache và 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);

Nó hoạt động trong máy cục bộ của tôi và cũng hoạt động trong webhost dựa trên IIS của tôi. Tuy nhiên, trên một máy chủ apache cụ thể, nó không hoạt động với Apache vì apache_get_modules () đã bị vô hiệu hóa nhưng mod_rewrite đã được bật trong máy chủ đó.


3

Bạn có thể nhận được một danh sách các mô-đun apache đã cài đặt và kiểm tra xem điều đó. Có lẽ bạn có thể kiểm tra xem nó đã được cài đặt hay chưa bằng cách tìm kiếm tệp dll (hoặc tương đương linux) của nó.


@kba Cách kiểm tra sau đó trong chế độ CGI.
ravisoni

3

Hai dòng mã:

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

1

Thêm một phương pháp nữa exec().

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

Nếu mod_rewriteđược tải, nó sẽ trả về "Rewrite_module" trong đầu ra.


0

Một ý tưởng khác, thực sự là một vụ hack bẩn thỉu, liên quan đến việc viết lại mod là máy chủ phụ thuộc vào một vấn đề không cần thiết của php: Tại sao không, nếu bạn có khả năng, hãy tạo một thư mục thử nghiệm đặt một .htaccess trong đó viết lại thành test.php, gọi thư mục thông qua http và kiểm tra xem bạn có nhận được kết quả như mong đợi trong test.php không.

Thật vậy, bẩn.


0

Sử dụng chức năng này:

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

0

Làm thế nào về việc thực hiện chuyển hướng đến một tệp đã biết và sau đó kiểm tra xem chuyển hướng đó có thực sự hoạt động với curl không?


0

Đối với anh hùng IIS và heroin:

Không cần phải tìm mod_rewrite. Chỉ cần cài đặt mô-đun Rewrite 2 và sau đó nhập tệp .htaccess .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.