2013-02-12 93 views
5

我试图通过使用mod_rewrite在php中写一点休息api。我的问题是: 如何处理HTTP DELETE和PUT? 例如,url将是: /book/1234mod_rewrite:如何重定向HTTP DELETE和PUT

其中1234是书的唯一ID。我想将这个id(1234)“重定向到”book.php,并将id作为参数。我已经知道如何在php脚本中读取PUT和DELETE变量,但是如何在mod_rewrite中设置此重写规则?

任何想法?

编辑: 一个GET重写规则是这样的:

RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

我怎么做这个“参数转发”为PUT和DELETE?据我所知,HTTP POST,PUT和DELETE使用HTTP请求体传输参数值。所以我想我需要在HTTP请求正文中追加参数。但我不知道如何用mod_rewrite来做到这一点。

我可以做一些混合DELETE和GET?

RewriteCond %{REQUEST_METHOD} =DELETE 
RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

然后在book.php中我将用户$ _GET [“身份证”]检索书籍ID,即使HTTP头说,HTTP方法是删除。它似乎没有工作...

+2

你可以在'%{REQUEST_METHOD}' – mario 2013-02-12 21:45:02

回答

3

我可以做一些混合删除和获取的:如果你想通过HTTP请求mthod重写这样使用它?

是的。在重写规则中,您根本不必担心请求方法或PUT正文。

对于你的榜样,这意味着:

mod_rewrite的

RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

HTTP请求

PUT /book/1234 
=> PUT /book.php?id=1234 

PHP脚本

$id = intval($_GET['id']); 
if ($_SERVER['REQUEST_METHOD'] === 'PUT') { 
    // yes, it is. go on as usual 
} 

进一步说明:GET参数和PUT/POST/DELETE参数之间的区别在于前者是URL的一部分,即请求主体的后半部分。 mod_rewrite只有更改网址并且不会触及正文。

+0

非常感谢! – sockeqwe 2013-02-13 13:19:23

5

有一个RewriteCond指令可用。您可以使用它来指定以下规则在特定条件下才有效。

RewriteCond %{REQUEST_METHOD} =PUT 
RewriteRule ^something\/([0-9]+)$ put.php?id=$1 

RewriteCond %{REQUEST_METHOD} =DELETE 
RewriteRule ^something\/([0-9]+)$ delete.php?id=$1 

# ... 
+0

上使用'Script PUT ...'或RewriteCond,但是我怎么把这个id作为PUT参数传递给php脚本:/ something/1234比我想要的东西.php可以检索ID =“123”莫名其妙。对于HTTP GET,我会这样做:RewriteRule something /([0-9] +)something.php?id = $ 1 [QSA]。如何为PUT和DELETE执行此参数转发?据我所知,我需要在HTTP请求正文中附加一个var。但我不知道如何做到这一点与mod_rewrite – sockeqwe 2013-02-13 10:00:10

+0

像任何其他重写规则 - >使用正则表达式。你可以按照大量的教程。或者查看我的更新 – hek2mgl 2013-02-13 11:59:10

+0

非常感谢! – sockeqwe 2013-02-13 13:18:57