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


149

我想知道是否可以检查是否mod_rewrite在中的Apache AND IIS上启用了该功能PHP

存在用于IIS的ModRewrite。检查一下here

因此,我正在寻找一个mod_rewriteApacheIIS上进行检查的PHP脚本

有谁知道这样的脚本或可以写一个?

特别是对于Microsoft IIS

谢谢!

Answers:


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 2012年

是的,因此适当地没有通用脚本?
领带

@DrCord然后,我猜您正在CGI中使用它。
kba

不,是在php脚本中使用它,就像答案和下面的答案一样。if(!function_exists('apache_get_modules')){phpinfo(); 死; }在我的服务器上始终是真实的……
DrCord 2013年

2
@Gerep phpinfo()在许多事情上都很有用,但是如果您想编写一个mod_rewrite启用了它或使用其他方式回退到其他行为的系统,则以编程方式检测它会很有用。
kba 2015年

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吗?
Owen McAlack

2
是的,我们可以在phpinfo.php中看到所有Apche的“已加载模块”
Mohini

52

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

这是一个非常有用且简单的解决方案,即使PHP作为CGI运行,它也可以正常工作
Jose

正如@RibeiroBreno提到的那样,使用<IfModule mod_env.c>几乎是完美的。这完全适合我。
卡森2015年

如果PHP作为CGI运行,这就是方法。做工精美。
Wojciech Jakubas 2015年

35

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

<?php 
phpinfo();

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


28

别那么困难,您只需在 phpinfo();

在此处输入图片说明

希望对您有所帮助!

谢谢


对我而言,这是最快,最简单的方法,因为我已经在用phpinfo调用/文件来做一些事情了。谢谢!:)
Brian U

@loyola,我无法更新我的评论,所以我删除了,谢谢
vanduc1102 '16


7
<?php
phpinfo();
?>

在“已加载模块”行的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的网络主机上运行。但是,在特定的apache服务器上,它不适用于Apache,因为apache_get_modules()已禁用,但在该服务器上启用了mod_rewrite。


3

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


@kba如何在CGI模式下进行检查。
ravisoni



0

关于mod重写的另一个想法,实际上是一个更肮脏的技巧,是服务器依赖而不是php问题:为什么不这样做,如果您有可能,请创建一个测试目录,在其中将.htaccess重写为test.php,调用该目录通过http并检查是否将预期结果放入了test.php。

确实,肮脏。


0

使用此功能:

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

0

如何进行重定向到已知文件,然后检查该重定向是否确实适用于curl?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.