2010-02-10 55 views
1

是否有可能拥有一个apache mod_perl处理程序,它接收所有传入的请求并根据一组规则来决定这个请求是否需要执行,如果不是,返回控制到Apache会正常服务请求?Apache mod_perl处理程序/调度程序将控制权返回给apache

用例:

它采用 的DirectoryIndex为在职的index.html (或类似)和默认的处理程序 Perl脚本等遗留现场,被赋予一种 劲达url-scheme (django/catalyst-ish)。调度员 将有一组映射到 控制器的URL,这些控制器在传入url上根据 分派。

但是,棘手的部分是 这个调度程序在与旧的 站点相同的虚拟主机上的相同的 名称空间内。我们的想法是逐个改写 网站,因为“全部更新” 迁移不会使用新系统 测试 网站性能,也不可能由于网站的纯粹 大小。

其中的诸多问题,是调度员现在可以接收所有的URL如预期,但DirectoryIndex的和静态内容(这是大多由不同的主机服务,但不是一切)没有正常提供服务。调度程序为非匹配的url返回一个Apache :: Const :: DECLINED,但Apache不会像往常一样继续提供请求,而是提供默认的错误页面。 Apache似乎没有试图寻找/index.html等

这怎么解决?你需要使用内部重定向吗?更改调度程序中的处理程序堆栈?使用一些聪明的指令?上述所有的?根本不可能?

欢迎您提出任何建议!

回答

1

我也做了类似的事情,但一段时间回来,所以我可能是有点含糊:

  • 我想你需要有标准的文件处理程序(我相信这是使用set-handler指令完成的)以及栈中的perl处理程序
  • 您可能需要使用PerlTransHandler或类似的钩子文件名/ URL地图ping阶段并确保内联的下一个处理程序将从文件系统中选择正确的文件。
+2

对此感兴趣的人可以快速更新。我添加了一个PerlTransHandler来指向MyClass :: handler,我在其中检查所有的URL对$ r-> uri()。如果匹配,执行:$ r-> handler('perl-script'); $ r-> set_handlers(PerlResponseHandler => sub {$ self-> dispatch();});返回值取决于期望的行为。如果没有匹配,则返回Apache2 :: Const :: DECLINED。 – myme 2010-02-11 14:05:58

0

如果文件系统中不存在请求的文件,也许您将使用mod_rewrite配置成功,该配置只会向调度程序重写URL。这样,您的新应用程序就像覆盖旧应用程序一样,并且可以通过在部署新部件期间删除应用程序的旧部分来逐步替换。

这可以通过RewriteCond和RewriteRule的组合来实现。您的新应用程序需要位于旧的应用程序中未使用的私有“名称空间”(位置)中。

我不是一个mod_perl的专家,但如与mod_php,并且它可以工作是这样的:

RewriteEngine on 

# do not rewrite requests into the new application(s)/namespaces 
RewriteRule ^new_app/ - [L] 

# do not rewrite requests to existing file system objects 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 

# do the actual rewrite here 
RewriteRule ^(.*)$ new_app/dispatcher.php/$1 
+0

我一直在想你提出的解决方案,但我无法解释如何用重写来解决它。我首先想到的是让调度员处理“所有”请求,但我认为它更聪明地处理所有“缺失”请求,即所有未通过DirectoryIndex或显式文件/ MIME类型处理程序找到的请求。这意味着Apache必须调用调度程序作为最后的手段,通常它会给出404。然后,即使调度程序拒绝,也会给出404。 – myme 2010-02-10 10:42:20

+0

我添加了一个建议重写配置的例子 – hurikhan77 2010-02-10 11:08:19