1

是否有可能有一个 apache mod_perl 处理程序,它接收所有传入的请求并根据一组规则决定该请求是否是它想要采取的行动,如果不是,则将控制权返回给 apache,它将正常处理请求?

一个用例:

使用 DirectoryIndex 服务 index.html(或类似文件)和 perl 脚本等的默认处理程序的旧站点正在被赋予更新的 url 方案(django/catalyst-ish)。调度程序将有一组 url 映射到基于传入 url 调度的控制器。

然而,棘手的部分是让这个调度程序在与旧站点相同的虚拟主机上的相同命名空间中。想法是逐个重写站点,因为“全部更新”迁移没有机会使用新系统测试站点性能,而且由于站点的庞大规模,它也不可行。

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

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

欢迎所有建议!

4

2 回答 2

1

我做过类似的事情,但不久前,所以我可能有点含糊:

  • 我认为您需要有标准的文件处理程序(我相信这是使用 set-handler 指令完成的)以及堆栈中的 perl 处理程序
  • 您可能需要使用PerlTransHandler或类似的方法来挂钩文件名/url 映射阶段,并确保下一个内联处理程序将从文件系统中选择正确的文件。
于 2010-02-10T11:01:46.777 回答
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
于 2010-02-10T10:23:11.140 回答