ISAPI_Rewrite正式版(非lite版)无效的原因

2010-12-11 19:35| 分类:tech web开发| 标签: | 9,787 次点击

天~已经两个月没写博客了,基本都去Buzz和新浪微博了,博客的更新频率只会越来越低,如有兴趣,可以follow我的新浪微博:http://t.sina.com.cn/tsenfine ,或者follow Buzz:https://www.google.com/profiles/yi.chenfang。我自己也有数月没打开Google Reader了。

因多个web项目需要用到rewrite,而lite版只支持全局的,所以升级了ISAPI为正式第三版,信用卡付款,现在还没没扣款,也还未发注册码。不过有45天试用,先下来用用。

先是备份lite版的httpd.conf文件,然后卸载了lite版的,然后重装。安装好后发现新版确实好用多了,不仅可对单个网站rewrite,而且可对单个文件夹下的文件rewrite,方法跟apache下的.htaccess差不多。但测试了下却发现原来的rewrite规则全都失效了。

于是找原因,首先在自己博客上找,没想到在2008年12月10日和2009年年11月12日都出现过类似的问题,真让我怀疑江恩说的“循环”的存在 : )

ISAPI Rewrite/IIS Rewrite无效的可能原因  2008-12-10

新版ISAPI Rewrite (Rewrite3_0067_Lite)无效的原因 2009-11-12

ISAPI_Rewrite正式版(非lite版)无效的原因 2010-12-10

首先是按以前两篇博客的内容检查了一遍,从IIS的“web服务扩展”到NTFS权限设置都检查过,又是重启IIS又是重启服务器的,但仍旧不行。后来看安装文档中的帮助文件:

一、首先应该检查ISAPI rewrite是否有在运行,方法有两种,一种是根据安装文档中的帮助来检查:

Put the following lines into httpd.conf file:

RewriteLogLevel 9
LogLevel debug

This will create error.log and rewrite.log files by default in the installation directory. If log files are created, this will indicate that ISAPI_Rewrite is running.

另外一种是随便写个规则看有没有在执行来检查。

二、我检查出来是有在运行的,那么打开Helicon Manager.exe,可以直接修改站点根目录下的.htaccess,但我却忘了清空全局的httpd.conf,导致后来调试问题一堆。正确的方法是应该清空全局的,然后把需要的规则写入站点目录下的.htaccess下。

当然我两个站点,一个是可以的,一个却不行,看了帮助文件夹下的:

If rules are working in httpd.conf file but not in other sections or .htaccess files, make sure to include RewriteEngine on directive in every section and .htaccess file. Also remember that rewriting base inside .htaccess files by default is different from httpd.conf. ISAPI_Rewrite automatically strips the local directory prefix from the path when in .htaccess or <Directory> section and applies rules only to the remainder. So if your rules start with a ‘/’ character, this should be removed in .htaccess file in the root folder of web site.

原来是规则不一样,比如像以下这种

RewriteEngine on  
RewriteRule /(\d{1,20}) /product.jsp?pid=$1

需要改成:

RewriteEngine on

RewriteBase /
RewriteRule (\d{1,20}) /product.jsp?pid=$1

这可以去参考帮助文件中的Example。

总结,像这种比较普遍的错误,看软件自带的帮助CHM还是非常有用的,比google出来的更方便更权威。

windows+IIS下完美设置wordpress伪静态

2009-12-26 22:30| 分类:wordpress 博客维护| 标签: | 7,835 次点击

不得已把wordpress迁移到了wimp平台下,seo强迫的我自然要求链接友好,但IIS6没有自带rewrite功能(据说IIS7会好点,wordpress可默认支持IIS7下的URL重写)。如果用ISAPI Rewrite得自己写正则匹配,还不一定能匹配的成功,于是我找到了一个更方便的方法,堪称完美。

这个方法是通过IIS的自定义404页面实现,首先在wordpress根目录下新建一个wp-404rewrite.php,然后把下面的代码复制到里面去:

<?php
// This is the default file for the site. Usually index.php
$default = 'index.php';

// The name of this file.
// Set this value for the URL in Custom Error Properties of your website in IIS.
// Goto: IIS Manager > Websites > [Site Name] > Properties > Custom Errors >
// 404 & 404;2 & 404;3 > URL (Requires a '/' prefix in IIS).
$thisfile = '404-handler.php';

$_SERVER['ORIG_PATH_TRANSLATED'] = str_replace($thisfile, $default, $_SERVER['ORIG_PATH_TRANSLATED']);
$_SERVER['SCRIPT_FILENAME'] = str_replace($thisfile, $default, $_SERVER['SCRIPT_FILENAME']);
$_SERVER['ORIG_PATH_INFO'] = str_replace($thisfile, $default, $_SERVER['ORIG_PATH_INFO']);
$_SERVER['SCRIPT_NAME'] = str_replace($thisfile, $default, $_SERVER['SCRIPT_NAME']);
$_SERVER['PHP_SELF'] = str_replace($thisfile, $default, $_SERVER['PHP_SELF']);
$_SERVER['PATH_INFO'] = false;

$qs =& $_SERVER['QUERY_STRING'];
$ru =& $_SERVER['REQUEST_URI'];
$pos = strrpos($qs, '://');
$pos = strpos($qs, '/', $pos + 4);
$_SERVER['URL'] = $ru = substr($qs, $pos);
$qs = trim(stristr($ru, '?'), '?');

// Required for WordPress 2.8+
$_SERVER['HTTP_X_ORIGINAL_URL'] = $ru;

// Fix GET vars
foreach ( $_GET as $var => $val ) {
  if ( substr($var, 0, 3) == '404') {
    if ( strstr($var, '?') ) {
      $newvar = substr($var, strpos($var, '?') + 1);
      $_GET[$newvar] = $val;
    }
    unset($_GET[$var]);
  }
  break;
}
include($default);
?>
在IIS里的“自定义错误”Tab处添加修改404的错误指向,“消息类型”选择“URL”,地址填上:/wp-404rewrite.php(我的是/wp-404-handler.php),然后访问博客主页,看看各个页面是不是可以了?

我用firebug和google webmastertools查看状态,都是200,并非404,所以不用担心google不收录这样的页面。

以上方法参见这里(英文):

http://www.ikailo.com/94/url-modrewrite-workaround-iis-60/

http://tech.einaregilsson.com/2007/07/30/pretty-wordpress-permalinks-on-iis/

(以下是写给自己看的):这个方法对我来说还会有点问题,我配置好后发现三个博客的categary不管是否中文都可以访问,比如“http://blog.linggan.com/tag/电子商务”,但日期分类页面和分页页面均无法访问。后来发现其他人用这个方法,却可以访问日期分类。观察了下原来他们的链接里多了一个斜杠号“/”,只要我在日期分类和分页链接后加个斜杠,也可以访问了。但发现有个人的博客用http://wp.feiyan.info/page/1 这样的链接也可以访问,我意识到不是斜杠不斜杠的问题。而是自己的配置问题,突然意识到有可能是以前写的rewrite规则冲突!原来我以前写过facepk.com的rewrite规则,凡是后面是数字结尾的都会进行匹配,而免费的rewrite是全局生效的,会让所有IIS下的网站都生效,所以就导致这个404的问题了!

解决办法,去掉facepk.com的rewrite规则,facepk.com流量很低,也不需要seo,不过这里做个备份:

RewriteRule /facepk/(\d{1,5})$ /facepk/facepk\.asp\?id=$1

RewriteRule /(\d{1,5})$ /facepk\.asp\?id=$1

另外,之所以前面tag/xxx可以访问,也是因为以前就在httpd.conf中加了以下两句,现在可以删了!

RewriteRule /tag/(.*) /index\.php\?tag=$1

RewriteRule /cat/(.*) /index\.php\?category_name=$1

现在httpd.conf里就没有东西了。

之前我还试过用ISAPI组件的方法来设置友好链接,但一直没设置成功。

IIS下的Wordpress URL重写组件:URL Rewriting for WordPress wp_url_rewriting:URL Rewriting for WordPress under IIS (V 2.1)

WordPress URL Rewrite | WP URL 重写组件WordPress URL Rewrite v1.0 for 32bit Windows (x86)

WordPress在Win-iis中的完美rewrite实现方法http://code.google.com/p/wp-url-rewriting-on-iis/downloads/list

新版ISAPI Rewrite (Rewrite3_0067_Lite)无效的原因

2009-11-12 16:31| 分类:web开发| 标签: | 5,514 次点击

以前我用的是ISAPI_Rewrite3_0058_Lite.msi 版的,这次用了新的0067版。但安装完后发现并没有启动,安装完后在网站右键-属性那的状态处并无绿色的成功标识。按之前写的那篇《ISAPI Rewrite/IIS Rewrite无效的可能原因》,我就猜测是目录无everyone权限的原因,但改为everyone权限,并重启IIS服务,甚至重启电脑后都不行。后来看到了下图中的Web服务器扩展,把“所有未知ISAPI扩展设为允许”,就可以了。

image

但以前的服务器上并无允许这个“未知ISAPI扩展”,但却可以使用ISAPI,猜测是因为ISAPI Rewrite更新版本之后,就变成“未知”的了,所以需要这里做个允许。看来服务器软件还是不要一昧追求最新的,可用和稳定最重要。

如果想为某个网站启用这个ISAPI服务,可以在网站属性的ISAPI筛选器那边自己添加。如下图所示:

image

为SMTP服务器添加用户名和密码

2009-03-27 0:42| 分类:web开发 windows 服务器| 标签: | 5,829 次点击

在windows2003 IIS中安装SMTP服务器提到了为了防止垃圾邮件可以在允许列表中设置只允许127.0.0.1,这样就防止了垃圾邮件,而且不需要填写用户名和密码就可以发送邮件,但有的程序/代码没有用户名和密码是没法发送邮件的,而且不用密码确实也不安全。所以还是要设置一下SMTP服务器的用户名和密码。

IIS里的用户名和密码都必须是windows账户里的用户。所以就必须先建立一个windows账户名。在用户帐户中添加一个用户,并设置组为:IIS_WPG(为了防止权限过大不安全,IIS_WPG全线足够了)

image

然后在IIS的“默认SMTP虚拟服务器”点击右键,配置SMTP服务器。

1、在“安全”选项卡中添加刚刚创建的用户。

2、在“访问”选项卡中的“身份验证”中勾选上“基本身份验证”

image

然后用我的一个PHP程序测试,本来没有用户名和密码是无法发送邮件的,设置好后马上就可以发送了(可惜是在QQ邮箱的垃圾箱里)。

Windows2003安装IIS+PHP+MySQL图解(wimp平台搭建)

2008-12-18 18:08| 分类:服务器| 标签: | 7,049 次点击

php的安装方式有很多,不过因为是在服务器上使用,所以我要求:

1、不用自动安装的exe(这样安装完全不知道系统被加了什么东西,有没有被添加服务,强烈建议抛弃此方式)
2、不修改环境变量(修改环境变量往往是为了在升级php时比较方便,但在服务器上为了一个使用php就修改环境变量太不合算了)

最终选定的方法是手动安装。

一、安装php程序所需文件。

先去官网php.net下载最新版的php-5.2.8-Win32.zip,然后在服务器上解压于C:/php下,并且在php文件夹下添加everyone用户组(这里权限设置是必须的,否则配置好不能正常运行)。

image

在php文件夹下找到php.ini-recommended,复制一份并命名为 php.ini,修改php.ini中的两个地方:

1、找到;extension=php_mysql.dll,去掉前面的分号。
2、找到extension_dir = "./",改为extension_dir = "C:/php/ext/" (C:/php/ext/为ext子目录的绝对路径)

然后把php.ini复制到Windows目录下面,把libmysql.dll复制到System32目录。

至此为止,php程序所需要的文件都有了。

二、配置IIS使之支持php。

资源管理器中新建一个目录作为网站目录,权限中添加everyone组。

添加筛选器:IIS中新建一个网站,打开属性对话框,选择ISAPI筛选器选项卡,添加一个名为php、可执行文件为php目录下的php5isapi.dll的筛选器(ISAPI Filters),如图:

image

然后点击“主目录”,修改“执行权限”为“纯脚本”:

image

添加映射:继续点击“配置”,在映射选项卡那添加一个扩展名为.php,可执行文件为C:\php\php5isapi.dll的映射,如图:

image

添加服务扩展:在IIS的“web服务扩展”里添加一个扩展,扩展名是PHP,要求的文件就是php5isapi.dll的路径,选中“设置扩展状态为允许”。

image

至此php已经配置成功,你可以在网站根目录下写一个php信息查看的文件phpinfo.php:

<?php
phpinfo();
?>

即可用http://localhost:80/phpinfo.php查看了。无需重启IIS,更无须重启服务器。

注意:期间有两个地方需要设置权限,如果这两个地方权限没设置好的话则php页面无法正常显示,分别是:

1、添加php目录的everyone权限
2、添加网站程序所在目录的everyone权限。

ISAPI Rewrite/IIS Rewrite无效的可能原因

2008-12-10 6:36| 分类:服务器| 标签: | 8,060 次点击

对SEO的追求有点强迫的症状了。于是用上了ISAPI Rewrite,ISAPI_Rewrite是一个强大的基于正则表达式的URL处理引擎,我安装的是官方的ISAPI_Rewrite3_0058_Lite.msi 免费版。免费版与收费版的主要区别是:“No support for distributed .htaccess configurations, directory and web site level configurations. Only one global httpd.conf configuration file will be loaded from Lite version installation folder.”

安装运行后,打开管理工具中Internet信息管理(IIS管理),在网站单击右键选属性,就可以看到ISAPI_Rewrite已经被加入到了ISAPI筛选器中。

按照默认安装的位置,可以在 C:\Program Files\Helicon\ISAPI_Rewrite 找到 httpd.ini 在此文件中输入Rewrite的规则即可。

正常情况下,修改rewrite规则不需要重起IIS,在为Apache编写的Rewrite的规则中,通常把

<IfModule mod_rewrite.c>
RewriteEngine On RewriteRule ^(.*)/archiver/([a-z0-9\-]+\.html)$ $1/archiver/index.php?$2 </IfModule>

其中黑体的部分去掉即可成为ISAPI Rewrite的规则。

但在我的服务器上,调试了很久都调试不出来效果,不清楚到底有无加载这个筛选器,于是我在虚拟机上又试了试。一次便试验成功了,证明是我的服务器其他地方的配置问题,看到IIS下安装配置ISAPI Rewrite,实现asp的静态化的一句话:“默认是装在C:\Program Files\Helicon下,要注意的是这个目录everyone要有读取权限。”才恍然大悟。

因为对系统盘的权限设置过分严格,所以导致新安装的组件都没有everyone权限,包括这里的Helicon文件夹,所以无法正常运行ISAPI Rewrite。但我添加了everyone的读取权限以后,URL Rewrite仍旧没有生效,又找了很多原因,直到最后只重启了一下变成功了。原来更改了组件的权限之后需要重启IIS。现在总结下:

ISAPI Rewrite无效/ISAPI Rewriterule无效的几个可能原因:

1、最可能的原因:C:\Program Files\Helicon没有开放everyone组的读取权限。

2、其次可能原因:C:\Program Files\Helicon已经开放everyone组的读取权限,但没有重启IIS。

2、不可能的原因1:虽然URL Rewrite功能看起来像是新建了目录,但实际上网站程序所在目录对于everyone组只要有普通的读取权限,并不需要有写权限。只要网站能被访问就不是这个网站权限设置的问题。

4、不可能的原因2:不需要像网上那么多的教程那样在IIS中做其他设置(在每个站点都添加了ISAPI Rewrite的ISAPI筛选器,对于这个免费版,安装完即可在也只能在全局范围内生效。所以不需要对每个站点进行设置。

改了权限后,必须在服务里重启一下IIS服务。但我在虚拟机里面没有任何重启操作(安装完后应该有一次自动的重启)。怎样判断何时重启呢?我有个粗略的方法,IIS对于是否要重启的策略可能是这样:对组件访问权限的更改,要在重启后才能生效;而对组件配置的更改(如httpd.conf)则不需要重启即可生效。在我的虚拟机中刚安装后ISAPI Rewrite程序目录的设置和权限就已经是足够开放的了,而且之后没有更改过权限,所以才不需要重启。

实际上,URL重写还有另外一个软件:IIS Rewrite,因为该软件主页的PR值居然是0,所以就没试过这个软件。接下来学习一下正则表达式,好尽快做出效果。

VMware主机访问虚拟机调试网站

2008-08-01 21:52| 分类:tech web开发| 标签: | 7,592 次点击

我现在机子的系统是XP,IIS一直有问题,重装了很多次都不能解决问题。因为使用了很久(一年半多了),所以不忍换新的。为了调试网站,就在vmware中安装了windows server 2003来调试。具体做法见之前写的《vmware组建XP+windows 2003开发者模式》,简单说就是把虚拟机中的IIS网站路径设为网上邻居中的路径(这个路径就是主机上的网站程序目录),然后在虚拟机中访问和调试(这样子调试ASP网页是没有问题的,但.net网站会因为权限不够的问题而不能正常调试)。但是这样子有很多问题。

比如我在虚拟机中也装上了FF3和firebug,甚至还装了The World和IE Development Toolbar,但在虚拟机中浏览器的鼠标手势都不能使用(Maxthon也是如此),所以每次都得去按后退按钮,很不符合我的习惯。

而且,今天发现了IE6的一个bug(DIV浮动IE文本出现3px间距的bug  IE 3-Pixel-Jog Bug),虚拟机中的win2003是IE6,主机是IE8,所以在虚拟机的IE6可以看到这个bug,但我想试试IE8中是否有这个bug,就必须让主机来访问这个网页了。

后来想到当初我做《VMware虚拟网络环境下使用Bind9模拟主DNS服务器,缓存DNS服务器》这个实验时曾把各个虚拟机用NAT相互连接起来,可以实现虚拟机和主机的互访。当时主要是测试Bind9搭建的DNS服务器的,除了用到虚拟机中的域名解析外,只是简单的ping了下,为何现在不试试用NAT中的IP直接访问虚拟机中的IIS架设的网站呢?于是google了下自己的博客,找到了《VMware采用NAT连接搭建虚拟局域网》,启动了VMware的共享上网服务,重启客户机,看到客户机中的本地连接是1Gbps,可以连接上了。然后在客户机中用ipconfig看到IP地址是:192.168.203.136,马上在主机xp中访问,发现可以正常访问,大功告成。

很惭愧,这么简单的调试网站的方法我没有想到,都已经做到用主机和虚拟机中的几台客户机搭建局域网的程度上了,还是没想到可以在主机用IP直接访问客户机中的网站。以前只懂得在虚拟机中调试,好多时间都浪费了!

给自己看的:

IIS问题,我今天最后一次用阿江探针查看了,发现IIS不支持Microsoft.XMLHTTP,而2003的IIS是支持的,不知道是不是这个原因,但我安装了MSXML4.0 sp2也没用,不打算再探究这个IIS的问题了。

一次IIS服务器调试

2008-04-10 11:07| 分类:windows 服务器| 标签: | 3,373 次点击

以往都是调试代码,这次是调试服务器 – -!调试服务器(IIS)比调试代码时间花得多多了。

一个ASP程序:问题是:在我的这个英文的xp上的IIS上架设,浏览主页没问题,但管理页面的某些页面总会出错。前面几篇文章就是为了找到一个开发环境,即可以在虚拟机(guest)中管理后台,在host中编辑源代码和浏览的开发模式,来避开这个问题。最终证明只有一开始的server 2003可以,但在虚拟机中毕竟麻烦,所以还是正视这个问题,找出原因,打算回到只用一台电脑调试的状态了 : (

1、怀疑是IIS问题,重装,没用。证明不是因为这个英文的IIS坏了。

2、怀疑是程序编码(GB2312)与英文不兼容的系统问题,换成UTF-8版本的程序,问题仍在。证明不是编码问题。

3、怀疑是IIS版本不够高的问题(虽然不太可能,毕竟人家是一个很稳定的程序),于是在windows server 2003、动网的主机、windows 2000 server上分别测试,都可以。证明不是IIS版本问题。

(在windows server 2008下不行,但不是同样的错误了。那是因为2008的好多安全机制,可能是处理URL中参数的问题,微软给出了一个博客地址,也懒得看了,彻底放弃server 2008。照这么看以后的windows server放弃支持asp只支持aspx都有可能,跟着微软,真累!)

(more…)