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

我想知道是否可以检查 PHP中的 阿帕奇人IIS是否启用了 mod_rewrite

ModRewrite 用于 IIS 的存在,请检查它 here

因此,我正在寻找一个 PHP 脚本,检查 阿帕奇人IIS.上的 mod_rewrite

有人会写这样的剧本吗?

特别是对于微软 IIS

谢谢!

277014 次浏览

您可以获得已安装 Apache 模块的列表,并对其进行检查。也许你可以通过搜索它的。Dll (或 Linux 等效)文件。

复制这段代码并运行它来找出答案。


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

如果使用 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

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

<?php
phpinfo();

在页面上搜索 mod _ rewrite,看看是否可以在 LoadedModule 下找到它。

我喜欢 克里斯蒂安 · 罗伊的解决方案:

###  .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 (我没有办法检查) ,但机会是好的。

<?php
phpinfo();
?>

在“已加载模块”行的 apache2处理程序的 Configuration 下查看。

这很简单,也很有效。

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

两行代码:

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

这是我当前检查 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 _ module ()被禁用了,但是在那个服务器上启用了 mod _ rewrite。

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

httpd -l

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

确实,很脏。

不要让它如此困难,你可以简单地在 phpinfo();中找到

enter image description here

希望有帮助!

谢谢

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

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

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

使用此功能:

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

对于 IIS 的英雄和海洛因:

不需要寻找 mod _ rewrite。 只需安装 重写2 模块,然后导入 . htaccess文件。

实际上,仅仅因为加载了模块,并不一定意味着在放置。Htaccess.您可能需要知道的是: 重写是否有效?确定的唯一方法是进行实际的测试: 在服务器上放置一些测试文件,然后用 HTTP 请求它。

好消息: 我创建 图书馆正是为了这样做(检测各种。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