一般资料只介绍 Zend Framework 与 Apache 通过 .htaccess 配置文件进行集成,实现访问的定向和分发。这是因为 apache 通过装载 mod_rewrite 模块实现了 URL Rewrite 技术,将所有的请求转发到 index.php。

     但由于 IIS 不支持基于 .htaccess 配置的 URL Rewrite,因此 Zend Framework 无法简单地在 IIS 下运行。但是,由于 IIS 支持基于 HttpModule 的 URL Rewrite,因此通过别的途径,是可以让 Zend Framework 在 IIS上跑的。我利用第三方软件 ISAPI_Rewrite 实现了这个功能,测试了一下控制器和视图,可以运行,更深入的应用还没有测试,大家可以继续探讨。

    Zend Framework 版本 1.5.1,PHP 版本 5.2.5,在 Windows Server 2003 R2(SP3) 的 IIS6.0 下测试。PHP.ini 的 include_path 已经包含至 Zend Framework 的 library 路径。

    本人的测试文件夹为:

    D:\MyPHP5\ZF_mydemo,里面包含 App 和 www 2个文件夹。
    D:\MyPHP5\ZF_mydemo\App 下包含 controllers、DB、models、views 文件夹。
    D:\MyPHP5\ZF_mydemo\www 用于保存 index.php 文件,所有的请求转发到这里。该文件内容为:

    <?php
      error_reporting(E_ALL|E_STRICT);
      date_default_timezone_set(’Asia/Shanghai’);
      //由于 php.ini 配置了Zend Framework 的库路径,这里省略 set_include_path 语句。
      include “Zend/Loader.php”;
      Zend_Loader::registerAutoload();  //可以用以上(1)和(2)任一个代替

      $fc = Zend_Controller_Front::getInstance();
      $fc->setControllerDirectory(’../App/controllers’);
      $fc->throwExceptions(true);
      $fc->setParam(’noViewRenderer’, true);
      $fc->setParam(’noErrorHandler’, false);
      $fc->dispatch();
    ?>

    我的访问地址为 http://[url],指向物理文件夹 D:\MyPHP5。测试地址是:http://[url]/zf_mydemo/www

    需要配置 ISAPI_Rewrite 文件夹下的 httpd.ini 文件(默认一般在 C:\Program Files\Helicon\ISAPI_Rewrite),加2条规则:

    RewriteRule /zf_mydemo/www/.*   /zf_mydemo/www/index.php
    RewriteRule /zf_mydemo/www   /zf_mydemo/www/index.php

    第二条规则是保证访问 http://[url]/zf_mydemo/www (不到斜杠)时不出错。

    这样我在浏览器里打开 http://[url]/zf_mydemo/www/example,就访问到了 D:\MyPHP5\ZF_mydemo\App\controllers 下的文件 exampleController.php。

    附注:费了这么大的神探索这个问题,让 ZF 和 IIS 结亲,总有点拉郎配的感觉!其实我个人是不喜欢也不赞成在 IIS 上跑 ZF 的,而 Zend 公司似乎也不愿意。所以我们在 Zend 的文档里和互联网上很少能找到在 IIS 上运行 ZF 的资料,操这份闲心的都是一些爱好者和像我这样的好事者。毕竟 Lamp 才是 PHP 的黄金搭档,作为技术,我们要让它们用在最合适的环境下。

    但是作为技术人员,有时我真的无法压制自己的好奇心,在尝试中,我体验到了探险家的乐趣:把看似可以实现的事情变成已然实现的结果。 这就是技术人员的好奇、执着(偏执?)、固执己见吧?