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,点确定保存后,就可以了。

“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编码的字符。。。

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

PHP中0和false的区别

今天发现自己弄的那个网址缩短的服务有缺陷,只要长网址没有加上 http:// 就无法成功跳转到目标网址,打算使用strpos()查找 http:// ,如果没有找到,则在网址最前面加上 http:// 。结果在测试的时候,发现不管有没有找到 http:// ,最后都被加上了http://。后来才明白,我是用if(!strpos($url,”http://”))来判断是否存在http://的,如果存在,则这个if不成立,如果不存在,则成立,问题是,当strpos查找到目标字符串时,返回的是目标字符串首次出现的位置,也就是说,即使查到了http://,返回的也是这个字符串开始的位置,也就是0,没有查到,返回的是boolean的false,在php中,两者都表示false,也就是说,不管有没有找到,if都会满足条件而执行,结果是最后都会被加上http://,不管网址中有没有http://。解决的办法很简单,用===全等于这个判断符号,这样,false===0就不会成立了,因为这两个是不同的类型。

听讲座无聊…

被骗去听招聘讲座了…来更新下博客…
听说留言板留言有问题,去看了下,果然有问题,进数据库一看,发现问题了,因为上次一直有人留垃圾回复,直接进数据库把那些留言删掉了,把自增长改回来了,结果正好改小了1,导致添加数据库的时候失败…这就要说那个留言板设计不好,没有批量删除功能,以后加吧,最近还是先搞Android吧,有个想法,做个很简单的游戏,最主要是要有个在线排名,额,打算用XML来传递排名数据。XML还有些地方没弄清楚,今天晚上开工。

php中编码的检测和转换

网页编码有很多种,入UTF-8和GB2312,如果在编码为GB2312的页面上显示UTF-8的中文文字,肯定会是乱码,这常常出现在读取其它网页的标题或者rss。解决办法是读取完后在处理前先判断是什么编码,然后转换为需要的编码,php中有个函数叫mb_detect_encoding() ,可以判断字符串是什么编码。
继续阅读