为了给出一些背景信息,我最初开始时的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以获取我的参数。一旦我开始引入多个参数,我看不出这是如何解决的。有没有我在这里缺少的东西,或者我是否需要以不同的方式看待它并改变我格式化参数的方式呢?
答案 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/