2008-12-28 91 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