Как проверить, включен ли 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включено.

KBA
источник
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
h0mayun
источник
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 />";  ?>
user1649798
источник
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).

TJHeuvel
источник
@kba Как проверить потом в режиме CGI.
ravisoni
3

Две строки кода:

$isEnabled = in_array('mod_rewrite', apache_get_modules());
echo ($isEnabled) ? 'Enabled' : 'Not enabled';
Амаль Мурали
источник
1

Еще один способ до конца exec().

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

Если mod_rewriteзагружен, он вернет "rewrite_module" в выводе.

Абхишек Гурджар
источник
0

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

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

webfan
источник
0

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

function apache_module_exists($module)
{
    return in_array($module, apache_get_modules());
}
черный
источник
0

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

rosell.dk
источник
0

Для героев и героинов IIS:

Не нужно искать mod_rewrite. Просто установите модуль Rewrite 2 и затем импортируйте файлы .htaccess .

Шади Намроути
источник