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

时间:2012-01-26 16:25:42

标签: php apache mod-rewrite iis

我想知道是否可以检查 mod_rewrite Apache IIS 是否启用PHP >

IIS存在

ModRewrite 。检查here

所以,我正在寻找一个PHP脚本来检查 Apache IIS上的mod_rewrite

有人知道这样的剧本还是可以写一个?

特别是对于Microsoft IIS

谢谢!

16 个答案:

答案 0 :(得分:124)

如果您使用的是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 :(得分:91)

复制这段代码并运行它以查找。


<?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>

答案 2 :(得分:51)

我喜欢Christian Roy's solution

###  .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(我无法检查),但可能性很大。

答案 3 :(得分:34)

使用此代码上传名为info.php的文件并运行它:

<?php 
phpinfo();

在页面上搜索mod_rewrite,看看是否可以在Loaded Modules下找到它。

答案 4 :(得分:26)

不要让你很难在phpinfo();

中找到它

enter image description here

希望有帮助!

由于

答案 5 :(得分:10)

通过命令行我们在centOs中可以做到这一点

httpd -l

答案 6 :(得分:7)

<?php
phpinfo();
?>

在“已加载模块”行的apache2handler中查看“配置”。

这很简单且有效。

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

答案 7 :(得分:6)

这是我目前检查是否为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的webhost中运行。但是,在特定的apache服务器上,它不适用于Apache,因为apache_get_modules()已被禁用,但mod_rewrite已在该服务器中启用。

答案 8 :(得分:3)

您可以获取已安装apache modules的列表,然后再对此进行检查。也许你可以通过搜索它的.dll(或linux等效文件)来检查它是否已安装。

答案 9 :(得分:3)

两行代码:

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

答案 10 :(得分:1)

通过exec()的另一种方法。

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

如果加载了mod_rewrite,它将在输出中返回“rewrite_module”。

答案 11 :(得分:0)

关于mod重写的另一个想法,实际上更多是一个肮脏的黑客是服务器dependend一个不必要的PHP问题: 为什么不,如果你有可能性,创建一个测试目录,将.htaccess重写为test.php,通过http调用目录,检查你是否得到了你在test.php中的预期结果。

确实,很脏。

答案 12 :(得分:0)

使用此功能:

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

对于IIS英雄和海洛因:

无需寻找mod_rewrite。 只需安装 Rewrite 2 模块,然后导入 .htaccess 文件。

答案 15 :(得分:0)

实际上,仅由于加载了模块,并不一定意味着已在放置.htaccess的目录中启用了指令。您可能需要知道的是:重写有效吗?唯一可以确定的方法是进行实际测试:将一些测试文件放在服务器上,然后使用HTTP请求。

好消息:我创建a library就是为了做到这一点(检测各种.htaccess功能)。使用此库,您所需要做的就是:

require 'vendor/autoload.php';
use HtaccessCapabilityTester\HtaccessCapabilityTester;

$hct = new HtaccessCapabilityTester($baseDir, $baseUrl);
if ($hct->rewriteWorks()) {    
    // rewriting works
}

(而不是$ baseDir和$ baseUrl,您必须提供要放置测试文件的路径以及可以到达它们的相应URL)

如果只想知道模块是否已加载,则可以执行以下操作:

if ($hct->moduleLoaded('rewrite')) {    
    // mod_rewrite is loaded (tested in a real .htaccess by using the "IfModule" directive)
}

该库位于此处:https://github.com/rosell-dk/htaccess-capability-tester