IIS7运行php,增加rewrite支持

第一步:

下载rewrite_2.0_rtw_x64.msi,在IIS7的服务器上安装,安装后,重启IIS,这时再打开IIS,会发现多了一个新的模块:URL Rewrite

第二步:

在php网站根目录下新建web.config文件,如果已存在,则编辑该文件,内容如下:

<?xml version=”1.0″ encoding=”UTF-8″?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name=”UrlRewriteRule1″ enabled=”true” stopProcessing=”true”>
<match url=”.*” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
<add input=”{REQUEST_FILENAME}” matchType=”IsDirectory” negate=”true” />
</conditions>
<action type=”Rewrite” url=”url.php?url={R:0}” />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

在iis下添加php支持并启用rewrite后的问题

最近想把php网站从Linux服务器搬到Windows服务器下,因为Windows服务器已安装IIS,80端口被占用,无法安装Apache,所以只能往IIS添加php支持。

系统是Windows Server 2003,IIS为6.0,添加php支持百度一下一大堆,按照教程来,没问题,唯一要注意的是文件夹的权限问题。

因为这个php网站要使用apache的rewrite功能,IIS没有这个功能,搜索了下,发现有个ISAPI_Rewrite的插件,支持Apache的.htaccess文件,语法基本一致,所以就是它了。

下载安装,没什么问题,但是使用的时候,发现总取不到正确的值,经测试发现,url上被自动添加了/eurl.axd/GUID这样的字符串,导致了正则匹配出错了。这个是ASP.NET 4.0添加的,网上的解释是:

ASP.NET 4.0在安装的时候,会在IIS6注册一个ISAPI Filter,叫做”aspnet_filter.dll”,ISAPI Filter会先于ISAPI处理程序前执行,它会在所有的的无后缀的URL后面加一串字符“/eurl.axd/GUID”, 同时ASP.NET 4.0还会在IIS默认添加一个请求映射规则“*.axd”,映射到aspnet_isapi.dll。此时,所有的无后缀URL加上“/eurl.axd/GUID”后都会变成带.axd后缀,这样就匹配*.axd的映射规则进行ASP.NET的处理通道。在进入ASP.NET通道后,ASP.NET处理程序会删除掉“/eurl.axd/GUID”,让它还原到无后缀的原始情况,并且不会对后续的请求处理带来任何影响。此时,所有的无后缀请求,就进入了ASP.NET的处理通道中。

解决办法也很简单,打开iis管理器,在网站上右击→属性→ISAPI筛选器,删除 ASP.NET_4.0.30319.0 这条记录,然后在你的ASP.NET 4.0网站上,右击→属性→ISAPI筛选器,添加一条记录,名称为ASP.NET_4.0.30319.0,路径为 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll,点确定保存后,就可以了。

竟然忽视了一个细节

今天Google了下自己的新闻站,发现Google上标题清一色的“新闻资讯站”。。。现在改过来了,能显示新闻的标题了。

今天发生了几件奇特的事,

1.这个博客评论邮件能成功发到我的邮箱了。

2.主页的访客人数纪录竟然被重置了。

3.那个低价的VPS今天又挂掉了,清一色的 403 Forbidden ,害的我以为被攻击了,结果是我的VPS所在的节点又挂掉了。。。

第一个和第三个不奇怪,能猜到发生什么事了,就中间那个郁闷了,怎么会突然从零开始计数了呢?看了代码没发现问题啊,这个和第一条联系在一起,难道这个服务器也被重启了,而且正好在有人访问我主页的时候?

不想了,看电影去了。。。

莫名其妙的故障

      好好的新闻网站 http://news.dudibo.com 在昨天添加新闻的时候竟然提示我上传文件失败,可郁闷了我一把。因为是自己做的网站,所以了解哪里有问题,应该是session的问题。在登录过程中会在session中写入登陆信息,然后在操作的时候先去session里读信息,看看是不是登录了或者是不是超时了,最后再进行操作。上传文件的时候也要进行验证,只不过那个验证里默认session是自动启动的,也就是说没用session_start()来开启session,而是在php.ini中直接开启session,好处是不用每次要用的时候去session_start()。

      想了半天,我也没想出我修改过php.ini,然后SSH登录VPS,查看那个网站的php.ini,发现session.auto_start = 0,也就是说没有自动启用session,于是改成1,重启apache,还是老样。仔细想了想,我上次修改的是etc下面的php.ini,于是去那边看了看,果然session.auto_start = 0,改成1,重启apache,这下正常了。

      仔细想了想,也许是前几天在Kloxo面板里修改了邮件服务器名称的缘故,把php.ini恢复成默认设置了。Kloxo面板太强大了,太专业了,选项多得眼镜要花掉了。。。不过这个把php.ini恢复成默认值让我有点想不通了,干嘛要恢复成默认值啊,改邮件服务器的名称改一下好了嘛。。。

      也许不是改邮件服务器名这个操作导致重置php.ini的,到底是怎么回事呢?只有下次再发生的时候才知道。。。

“iconv() : Detected an illegal character in input string”的解决办法

PHP传给JS字符串用ecsape转换加到url里,又用PHP接收,再用网上找的unscape函数转换一下,这样得到的字符串是UTF-8的,但我需要的是GB2312,于是用iconv转换,开始是这样用的
$str = iconv(‘UTF-8’, ‘GB2312’, unescape(isset($_GET[‘str’])? $_GET[‘str’]:”));
上线后报一堆这样的错:iconv() : Detected an illegal character in input string

考虑到GB2312字符集比较小,换个大的吧,于是改成GBK:
$str = iconv(‘UTF-8’, ‘GBK’, unescape(isset($_GET[‘str’])? $_GET[‘str’]:”));
上线后还是报同样的错! 继续阅读

又是编码问题。。。

文件保存时的编码问题真头痛,用PHP的Json_encode编码时需要把中文的GBK转换为UTF-8,不然Json_decode解码后出来的是空的。不知怎么的把index.php那个文件的编码改成UTF-8了,这下好了,从别的php文件中下载这个文件里的内容,用Json_decode解码后出来的东西还是解码前的。。。找啊找啊,最后发现直接把index.php输出的东西复制到一个php文件里,在php文件里直接解码,结果正确了,用mb_detect_encoding()发现Json_decode只能解码ASCII编码的字符。。。

哎,编码问题就是这么烦啊,谁叫世界上不同的语言文字这么多呢。 继续阅读