2008-12-28 41 views
19

我來自Java背景,並且使用任何基於servlet的技術,將一系列URL(例如/ reports/,/ secure/ .do)映射到指定的servlet是微不足道的。現在我對PHP不太熟悉,但我還沒有看到任何與PHP(或mod_php)完全相同的東西。我完全有可能錯過簡單的東西。PHP中的URL映射?

你如何在PHP中做到這一點?

我想這樣做的原因之一是「一次性使用」網址。現在,這可以使用GET參數來完成(比如MD5哈希令牌),但我對URL映射感興趣,並將其作爲許多問題的一般解決方案。

使用類似此類內容的另一個重要原因是具有RESTful URL。

回答

2

無法在PHP中完成。請注意,在Java中,不是映射URL的Servlet,而是Servlet容器(例如Tomcat)的配置。

您可以通過使用URL rewriting.

2

這聽起來似乎mod_rewrite的通常會被用於實現對PHP應用程序類似的結果(例如Apache,而不是PHP的一部分。)我沒有在PHP中聽到的任何事情會做到這一點。

13

其他如已經報道過的,你可以用一個簡單的技巧來做一點魔術。

投入的.htaccess喜歡與你選擇的正則表達式這一個

<FilesMatch "^servlet$"> 
    ForceType application/x-httpd-php 
</FilesMatch> 

替代^ $ servlet的一個指令(這將是您的調度員的名稱)

文件的servlet應與此類似

<?php 
    $data = explode('/',$HTTP_SERVER_VARS['PATH_INFO']); // $data[0] always empty 
    $fileToInclude = $data[1].'.php'; 
    if (file_exists($data[1]) { 
    $params=array_slice($data,2); // you can do here something more sophisticated 
            // for example sanitize parameters or assemble 
            // an hash 
    include ($fileToInclude);  //Think to this file as a servlet 
    } else { 
    // issue a 404 error, maybe one of the 500 series 
    } 
?> 

的URL可以具有以下形式:http://yoursite/servlet/reports/sales/2009 還可以達到形態http://yoursite/reports/sales/2009與.htacces和調度程序稍微有些不同。

此方法的優點是,不需要mod_rewrite作爲FilesMatch(1.3+)和ForceType(2。0+)是在Apache核心

參見參考
http://httpd.apache.org/docs/2.2/mod/core.html#forcetype
http://httpd.apache.org/docs/2.2/mod/core.html#filesmatch
http://www.devarticles.com/c/a/Apache/Using-ForceType-For-Nicer-Page-URLs/1/

2

正如其他人所說的,你可以使用mod_rewrite來做到這一點,但你也可以使用前端控制器設計模式,這是許多Web框架使用的模式。看看Horde routesZend_Controller_Router_Rewrite它可以用於MVC,

12

我使用的一個技巧是$ _ SERVER ['PATH_INFO'](我認爲你需要Apache)。這會在PHP文件擴展名後爲您提供所有信息。

http://www.example.com/page.php/rest/url 

的$ _ SERVER [ 'PATH_INFO']將包含:然後

"/rest/url" 

頁面可以重定向,過程中的一些代碼或任何基於該字符串。

如果您無法訪問Apache Configs或.HTACCESS,那麼這很好。同樣如果事情發生變化,您可以爲page.php創建靜態文件放置的目錄名稱。哦,PHP不需要.php擴展名。過去我使用過.api或其他。

http://www.example.com/worker.api/rest/url 

這似乎對我很好。

+0

這也適用於Lighttpd。 – neu242 2009-05-22 11:24:15