【问题标题】:URL mapping in PHP?PHP中的URL映射?
【发布时间】:2008-12-28 01:02:26
【问题描述】:

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

你如何在 PHP 中做到这一点?

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

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

【问题讨论】:

    标签: php apache rest


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      除了使用 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
        }
      ?>
      

      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/

      【讨论】:

        【解决方案3】:

        我使用的一个技巧是 $ _ 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
        

        这对我来说似乎很有效。

        【讨论】:

          【解决方案4】:

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

          您可以使用URL rewriting. 为 PHP 应用程序实现类似的结果

          【讨论】:

            【解决方案5】:

            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】:

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

              【讨论】:

                【解决方案7】:

                这听起来像是 mod_rewrite 通常用于(作为 Apache 的一部分,而不是 PHP 的一部分)。我还没有听说过 PHP 中有任何东西可以做到这一点。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-20
                  相关资源
                  最近更新 更多