如何在“清理”PHP REST API后访问查询字符串参数?

时间:2014-02-19 17:17:19

标签: php .htaccess api rest

为了给出一些背景信息,我最初开始时的api看起来像这样:

http://myserver/api.php?action=projects

在我的api.php文件中,我有一个简单的if语句来检测操作,然后做出相应的反应:

if (isset($_GET["action"])
{
    switch($_GET["action"])
    {
        case "projects"
          dostuff();
        break;
        case "otherstuff"
          dootherstuff();
        break;
       ...
    }
}

但是,我当然想要清理它,所以我可以去这个网址:

http://myserver/api.php/projects

并获得相同的结果。通过阅读之前的SO帖子,我能够做到这一点:

Using Clean URLs in RESTful API

最终通过在我的根目录中创建一个.htaccess文件并使用重写引擎来实现它:

RewriteEngine On
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L]

这很棒!除了一个问题,因为我使用的是干净的URL,它似乎不再认识到存在GET参数。

我发现我可以使用了     $ _SERVER [ 'REQUEST_URI'];

然后解析URL以获取我的参数。一旦我开始引入多个参数,我看不出这是如何解决的。有没有我在这里缺少的东西,或者我是否需要以不同的方式看待它并改变我格式化参数的方式呢?

2 个答案:

答案 0 :(得分:2)

您可以使用以下规则:

RewriteEngine On

RewriteRule ^(?:action|api\.php)/([^/.]+)/?$ api.php?action=$1 [L,NC,QSA]

答案 1 :(得分:0)

更改为:

RewriteEngine On
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L, QSA]

您需要QSA参数才能保持查询字符串不变。所以现在这是可能的:

/action/projects/?my=name

或者你可以这样做:

RewriteEngine On
RewriteRule ^action/([^/\.]+)/([^/\.]+)/?$ api.php?action=$1&method=$2 [L, QSA]
RewriteRule ^action/([^/\.]+)/?$ api.php?action=$1 [L, QSA]

现在你将拥有这些网址:

/action/projects/add/
/action/projects/