【发布时间】:2011-11-13 13:49:31
【问题描述】:
我正在努力实现的目标
给定一个顶级 URL,例如 http://www.myapp.com/
如果有人要求:
http://www.myapp.com/questions/id/1
我想获取“questions/id/1”部分并将其传递给适当的 Perl 脚本以检索所需的资源。
我的成就
目前我知道如果 url 中有一个额外的级别怎么做,像这样:
http://www.myapp.com/model/questions/id/1
其中“model”只是一个典型的 Perl CGI 脚本,但它没有“.pl”扩展名,Apache perl 处理程序被配置为处理这个,“questions/id/1”部分被解释为路径信息(通过 CGI->path_info())传递给“模型”。
这个想法来自 Andrew Hanenkamp 在 onlamp.com 上关于该主题的文章: Developing RESTful Web Services in Perl
还有什么问题
但是,这种方法不适用于顶级 url,因为没有地方放置“模型”或任何调用的处理程序。我尝试在配置中设置默认文档设置,以便 http://www.myapp.com/ 默认为 http://www.myapp.com/modle。
所以输入http://www.myapp.com/questions/id/1 被处理为http://www.myapp.com/model/questions/id/1
但是,Apache 认为这是一个 404 错误。
我怎样才能做到这一点?这甚至是 Perl 的工作还是在 Apache 配置级别更好地处理,或者可能利用一些 Apache API 来捕获 404 错误并从那里提取“/questions/id/1”部分?我不知道。也许这里有人知道。 ;-)
注意:很抱歉以冗长的措辞和迂回的方式提出这个问题。我不太确定引出主题答案所需的术语是什么。在之前在这里和其他地方提出这个问题时提到一个以 R 开头并以 T 结尾的四个字母的单词,导致了关于所说的字母单词的性质以及使用某些框架或其他框架的好意但无益的建议的激烈讨论。我只是想知道这些框架是如何实现这个特性的,我想在 Perl 中实现一个来学习如何去做。
更新: 建议的答案之一使我尝试了 mod_rewrite。作品。但是,为每个映射手动设置 Apache 的 conf 是相当不切实际的。进一步的搜索让我找到了 O'Reilly 的书“Practical mod_perl”。在其中,Bekman 和 Cholet 写了关于通过 Apache CPAN 包以编程方式访问 mod_rewrite 以设置重写。 Appendix 10 : "mod_rewrite in Perl" 现在写一些代码来测试这本书的想法。同时,如果有更好的方法可以做到这一点,请分享。
结论
在对两个 uri 路由/调度程序(或 Whatchamacallit)脚本进行原型设计后,一个依赖 mod_rewrite 调用它,另一个依赖 ErrorDocument;我得出的结论是 mod_rewrite 是实现这一点的正确方法。
ErrorDocument 方法是错误的,因为它不保留来自重定向页面的 POST 数据。 向http://www.myapp.com/questions 发送 POST 请求以创建新资源是不可能的,因为 ErrorDocument 调用的自定义错误处理程序脚本无法使用 POST 数据。此外,由于定义的每个请求都不会访问物理文件,因此 Apache 的错误日志将充满 spurios 404 file not found 错误。这可能是一个巨大的问题,即服务器的交易量很高。感谢大家为我指明正确的方向。现在我的好奇心得到了满足。
【问题讨论】:
-
如果有人认为问题的措辞不正确,请提出更改建议。我对要使用的正确术语感到困惑。谢谢。
-
你可以在标题中添加“CGI”——“使用 Perl”有点模糊!
-
您的两个答案(yko,evil otto)都是完成此任务的好方法。 :-) 但是,在所有条件相同的情况下,我现在倾向于重写,因为我认为为了重新路由而预期会发生错误是一种美学上不那么吸引人的方法。在决定选择哪个答案之前,让社区对这些不同的方法进行投票。
标签: perl apache cgi url-routing