我正在努力實現如何使用Perl獲取頂級網址的路徑信息?
給出一個頂級網址,如http://www.myapp.com/
如果有人要求:
http://www.myapp.com/questions/id/1
我想要得到的「問題/ ID/1「部分,並將其傳遞給適當的Perl腳本以檢索所需的資源。
我已經取得了
目前,我知道該怎麼做,如果有一個在URL額外的水平,像這樣:
http://www.myapp.com/model/questions/id/1
當「模特」是一個簡單的典型的Perl CGI腳本,除了它沒有「.pl」擴展名,並且Apache perl處理程序被配置爲處理這個,「questions/id/1」部分被解釋爲路徑信息(通過CGI-> path_info())傳遞給「模型」。
我去安德魯Hanenkamp的文章這種想法對onlamp.com主題: Developing RESTful Web Services in Perl
什麼仍然是錯的
這種方法,然而,這並不爲頂級網址工作,因爲有沒有地方放置「模型」或任何處理程序被稱爲。我試圖在配置中設置默認文檔設置,以使http://www.myapp.com/默認爲http://www.myapp.com/modle。
讓打字http://www.myapp.com/questions/id/1作爲http://www.myapp.com/model/questions/id/1
處理然而,阿帕奇認爲這是一個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"現在編寫一些代碼來測試本書的想法。同時,如果有更好的方法來實現這一點,請分享。
結論
原型2 URI路由/調度程序(或Whatchamacallit)腳本後,一個依靠mod_rewrite的調用它,而另一個上的ErrorDocument;我得出結論,mod_rewrite是實現這一點的正確方法。
ErrorDocument方法錯誤,因爲它不保留來自重定向頁面的POST數據。 由於發送POST請求到http://www.myapp.com/questions來創建新資源是不可能的,因爲POST數據對ErrorDocument調用的自定義錯誤處理程序腳本不可用。此外,由於每個定義的請求都不會訪問物理文件,因此Apache的錯誤日誌將充滿spurios 404文件找不到的錯誤。這可能是一個巨大的問題是服務器的交易量很高。感謝大家指點我正確的方向。現在我的好奇心已經飽和了。
如果有人認爲問題措辭不正確,建議更改。我很難理解要使用的正確術語。謝謝。 – GeneQ
你可以給標題添加'CGI' - '使用Perl'有點含糊! – plusplus
你的答案(yko,evil otto)都是很好的有效方法來完成這項工作。 :-)但是,所有事情都是平等的,我傾向於在這一點上進行重寫,因爲我認爲,爲了重新路由而發生錯誤是一種美學上不太吸引人的方法。讓我們讓社羣在決定選擇哪個答案之前對這些不同的方法進行投票。 – GeneQ