Как проверить, включен ли mod_rewrite в php?


149

Мне было интересно, если можно проверить, mod_rewriteвключен ли на Apache и IIS в PHP.

ModRewrite для IIS существует. Проверьте это here.

Итак, я ищу скрипт PHP, который проверяет mod_rewriteна Apache и IIS.

Кто-нибудь знает такой сценарий или может написать?

Специально для Microsoft IIS .

Спасибо!

Ответы:


125

Если вы используете mod_php, вы можете использовать apache_get_modules(). Это вернет массив всех включенных модулей, поэтому, чтобы проверить, mod_rewriteвключено ли, вы можете просто сделать

in_array('mod_rewrite', apache_get_modules());

К сожалению, вы, скорее всего, пытаетесь сделать это с CGI, что делает его немного сложнее.

Вы можете проверить это, используя следующее, хотя

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

Если вышеупомянутое условие оценивается как true, тогда mod_writeвключено.


1
Я не знаю. Это проверяет, установлен ли модуль mod_rewrite. Модуль IIS Mod-Rewrite, на который вы, вероятно, ссылаетесь, является совершенно другим и коммерческим продуктом - он не связан с модулем Apache, это совершенно другой вопрос, и у меня нет опыта его использования.
KBA

Это правда, так что нет общего сценария?
Галстуки

@DrCord Тогда я предполагаю, что вы используете его в CGI.
kba

Нет, использовал его в сценарии php так же, как ответ и ответ ниже. if (! function_exists ('apache_get_modules')) {phpinfo (); умереть; } всегда верно на моем сервере ...
DrCord

2
@Gerep phpinfo()может быть полезен для многих вещей, но если вы хотите написать систему, которая использует, mod_rewriteесли она включена или иным образом откатывается к какому-либо другому поведению, было бы полезно обнаружить ее программно.
kba

94

Скопируйте этот кусок кода и запустите его, чтобы узнать.


<?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 также скажет мне, если у меня не включен mod_php?
Оуэн МакАлак

2
да, мы можем видеть в phpinfo.php все «загруженные модули» Apche
Мохини,

52

Мне нравится решение Кристиана Роя :

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

Затем вы можете проверить в своем коде PHP для

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

Не знаю, работает ли это также с IIS (у меня нет возможности проверить), но шансы хорошие.


4
С <IfModule mod_env.c>ним было бы почти идеально. :)
РибейроБрено

Это очень полезное и простое решение, и оно работает, даже если PHP работает как CGI
Хосе Б.

как упоминалось @RibeiroBreno, с <IfModule mod_env.c> это было бы почти идеально. это сработало для меня отлично.
Кассем

Если PHP работает как CGI, это путь. Работает красиво.
Войцех Якубас

35

Загрузите файл с именем info.php с этим кодом и запустите его:

<?php 
phpinfo();

Найдите на странице mod_rewrite и посмотрите, сможете ли вы найти его в разделе «Загруженные модули».


28

не усложняйте, вы можете просто найти в phpinfo();

введите описание изображения здесь

Надеюсь полезно!

Спасибо


Это был самый быстрый и простой маршрут для меня, так как я уже делал вещи с вызовом / файлом phpinfo. Спасибо! :)
Брайан U

@loyola, я не могу обновить свой комментарий, поэтому я удалил, спасибо
vanduc1102

11

через командную строку мы в CentOs мы можем сделать это

httpd -l

1
И если вы используете Ubuntu: apache2 -l
youanden

2
Или apachectl -M в Ubuntu
Batandwa

Похоже, это показывает только модули, которые были скомпилированы.
jayarjo

2
httpd -M показывает список загруженных статических и общих модулей.
Джаярджо

7
<?php
phpinfo();
?>

Посмотрите под Конфигурацией в apache2handler в строке Loaded Modules.

Это просто и работает.

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

7

Это мой текущий метод проверки, включен ли Mod_rewrite для Apache и 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);

Он работает на моей локальной машине, а также на моем веб-хосте на основе IIS. Однако на конкретном сервере Apache он не работал для Apache, так как apache_get_modules () был отключен, но на этом сервере был включен mod_rewrite.


3

Вы можете получить список установленных модулей Apache и проверить это. Возможно, вы можете проверить, установлен ли он, выполнив поиск файла .dll (или аналога linux).


@kba Как проверить потом в режиме CGI.
ravisoni



0

Другая идея, более грязная, в отношении переписывания модов, заключается в зависимости сервера от ненужной проблемы с php: почему бы, если у вас есть возможность, создать тестовый каталог, поместить в него файл .htaccess, переписать в test.php, вызвать каталог через http и проверьте, если вы получите ожидаемый результат, который вы положили в test.php.

Действительно, грязно.


0

Используйте эту функцию:

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

0

Как насчет того, чтобы сделать перенаправление на известный файл и затем проверить, действительно ли это перенаправление работает с curl?


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.