PHP如何检测IIS上是否安装了重写模块

时间:2017-07-02 04:24:43

标签: php apache iis module url-rewriting

我在PHP中编写一个应用程序来托管在Web服务器上。我不知道Web服务器是IIS还是Apache。我不知道是否安装了适当的重写模块。我需要检测Web服务器,并检测模块是否已安装,然后相应地执行代码。到目前为止,我知道如何检测服务器是IIS还是Apache,并且有一个相当好的方法来检测Apache上的模块:

我的.htaccess文件是:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    SetEnv HTTP_MOD_REWRITE On
    RewriteEngine On
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f
    RewriteRule ^.*$ ./index.php
</IfModule>

我可以通过这种方式检测apache和模块:

$mod_rewrite=false;
if(strpos(strtolower($_SERVER['SERVER_SOFTWARE']),'apache')!==false){
    if(function_exists('apache_get_modules')){
        $modules=apache_get_modules();
        $mod_rewrite=in_array('mod_rewrite',$modules);
    }
    else{
        $mod_rewrite=getenv('HTTP_MOD_REWRITE')=='On'?true:false;
    }
}

我可以像这样检测IIS:

if(strpos(strtolower($_SERVER['SERVER_SOFTWARE']),'microsoft-iis')!==false){
    ...
}

我可以通过将其放在IIS web.config文件中来实现与Apache中发生的相同的重写,但是在IIS上:

<?xml version="1.0" encoding="utf-8"?>
<!--web.config url rewrite-->
<configuration> 
  <system.webServer>
      <rewrite>
          <rules>
              <rule name="Redirect To Index" stopProcessing="true">
                  <match url=".*" />
                  <conditions>
                      <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                  </conditions>
                  <action type="Rewrite" url="/index.php" />
              </rule>
          </rules>
      </rewrite>
  </system.webServer>
</configuration>

但我不知道如何在PHP中检测重写模块是否正确安装并正常工作。 PHP中有没有办法做到这一点?

如果重写工作正常,我对使用PHP检查特定URL是否返回已知字符串的建议持开放态度。例如,如果我使用PHP来查询http://example.com/something并且它实际上返回了http://example.com/test.html上的内容(内容已知),则表明重写模块正在工作。如果不是,请求将返回404未找到错误。

但是如何让PHP查询同一台服务器上的URL?我查询localhost了吗?例如,

$content=file_get_contents('http://localhost/something');
if($content=='success'){
    // works!
}
else if( /* Error 404 */ ){
    // rewrite not working
}

或者服务器的域名是否可以在本地脚本中运行?

0 个答案:

没有答案