我在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
}
或者服务器的域名是否可以在本地脚本中运行?