PHP中的URL映射?

时间:2008-12-28 01:02:26

标签: php apache rest

我来自Java背景,并且使用任何基于servlet的技术,将一系列URL(例如/ reports / ,/ secure / .do)映射到指定的servlet是微不足道的。现在我对PHP不熟悉,但我还没有看到任何与PHP(或mod_php)完全相同的东西。我完全有可能错过一些简单的东西。

你如何用PHP做到这一点?

我想要这样做的原因之一是“一次使用”网址。现在可以使用GET参数(比如MD5哈希标记)来完成,但我对URL映射感兴趣,作为许多问题的一般解决方案。

使用这样的东西的另一个重要原因是拥有RESTful URL。

7 个答案:

答案 0 :(得分:23)

使用Apache,您可以使用mod_rewrite为您的php页面设置URL重写,请检查以下资源:

答案 1 :(得分:13)

除了使用mod_rewrite之外,正如已经报道的那样,你可以用一个简单的技巧做一些魔术。

将.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
  }
?>

网址可以采用以下格式: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 :(得分: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

这似乎对我有用。

答案 3 :(得分:2)

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

使用URL rewriting.

可以为PHP应用程序获得类似的结果

答案 4 :(得分:2)

这听起来像是mod_rewrite通常用于的东西(作为Apache的一部分,而不是PHP。)我没有在PHP中听到任何可以实现此目的的东西。

答案 5 :(得分:2)

Apache以外的HTTP服务器的选项:

如果您使用的是Lighttpd,那么他们的mod_rewrite模块具有完全不同的配置语法。有关详细信息,请参阅http://redmine.lighttpd.net/wiki/1/Docs:ModRewrite

如果您使用的是IIS,则需要ISAPI_Rewrite(http://www.isapirewrite.com/)或URL重写模块(http://learn.iis.net/page.aspx/460/using-url-rewrite-module/)。

答案 6 :(得分:2)

正如其他人所提到的,您可以使用mod_rewrite来执行此操作,但您也可以使用前端控制器设计模式,这是许多Web框架使用的模式。看一下可以用于MVC的Horde routesZend_Controller_Router_Rewrite