如何检查PHP中是否启用了mod_rewrite?

152

我想知道是否有可能在PHP中检查ApacheIIS上是否启用了mod_rewrite

ModRewrite适用于IIS。 在这里进行检查。

因此,我正在寻找一个检查 Apache IIS 上的 mod_rewrite 的PHP脚本。

有人知道这样的脚本或可以编写一个吗? 特别是适用于Microsoft IIS

谢谢!

15个回答

127
如果你正在使用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
你的 PHP 脚本很容易就可以成为 CGI。 - kba
@kba,我不知道在共享服务器上传递给shell_exec的路径是什么,我尝试通过SHELL命令获取它,但我没有权限,而且$_SERVER['path']根本不起作用。 - Ravi Soni
2
@Gerep phpinfo() 可以用于许多事情,但如果您想编写一个系统,该系统使用 mod_rewrite(如果启用)或者回退到其他行为,则通过编程检测它可能会很有用。 - kba
尝试执行 strpos(shell_exec('/usr/local/apache/bin/apachectl -l'), 'mod_rewrite') !== false,但出现了 -bash: syntax error near unexpected token 'shell_exec' 的错误。 - Kangarooo
显示剩余6条评论

96

复制此代码并运行以查找结果。


<?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吗? - Owen McAlack
2
是的,我们可以在phpinfo.php中看到所有Apache的“已加载模块”。 - Mohini

54

我喜欢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>

然后,您可以在您的PHP代码中检查

    array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

不确定这是否适用于IIS(我无法检查),但可能性很大。


4
如果加上 <IfModule mod_env.c> 的话,就几乎完美了。 :) - RibeiroBreno
这是一个非常有用和简单的解决方案,即使PHP作为CGI运行也能正常工作。 - Jose B
正如@RibeiroBreno所提到的,使用<IfModule mod_env.c>几乎完美。这对我来说完全有效。 - Kassem
如果PHP作为CGI运行,这是最好的选择。效果非常好。 - Wojciech Jakubas
谢谢!@a.l.e - Даниил
我喜欢这个想法。另一个优点是:这也会间接检查是否考虑了 .htaccess 文件。 - Yosko

35

上传一个名为info.php的文件,并使用以下代码运行:

<?php 
phpinfo();

在页面上搜索 mod_rewrite,并查看是否可以在已加载的模块下找到它。


28

不要让它变得太困难了,你可以在 phpinfo(); 中简单查找。

输入图像描述

希望有所帮助!

谢谢


这对我来说是最快捷和最简单的方法,因为我已经在使用phpinfo调用/文件进行操作了。谢谢! :) - Brian U
@loyola,我无法更新我的评论,所以我删除了。 - vanduc1102

11

通过命令行,我们可以在CentOS上执行此操作。

httpd -l

1
如果你使用的是Ubuntu系统:apache2 -l - youanden
2
在Ubuntu中也可以使用apachectl -M - Batandwa
这似乎只显示已编译的模块。 - jayarjo
2
httpd -M 显示已加载的静态和共享模块列表。 - jayarjo

7
<?php
phpinfo();
?>

在"Loaded Modules"行中,查找apache2handler配置。这很简单并且有效。
<?php foreach( apache_get_modules() as $module ) echo "$module<br />";  ?>

7

这是我目前检查Apache和IIS是否启用Mod_rewrite的方法

/**
 * --------------------------------------------------------------
 *  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的Web主机上工作。然而,在特定的Apache服务器上,它无法正常工作,因为apache_get_modules()被禁用了,但该服务器启用了mod_rewrite。


3
你可以获取已安装的 apache 模块 列表,并进行检查。也许你可以通过搜索其 .dll 文件(或 Linux 等效文件)来检查是否已安装。

如何在CGI模式下检查"then"。 - Ravi Soni

3

两行代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接