mod_rewrite:如何重定向HTTP DELETE和PUT

时间:2013-02-12 21:41:42

标签: php http mod-rewrite http-delete

我试图通过使用mod_rewrite在php中编写一些小的api。

我的问题是: 如何处理HTTP DELETE和PUT? 例如,网址将是: /书/ 1234

其中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 Request Body来传输参数值。所以我想我需要在HTTP请求体中附加参数。但我不知道如何用mod_rewrite做到这一点。

我可以进行某种混合DELETE和GET吗?

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

然后在book.php中,我会使用$ _GET ['id']来检索book id,即使HTTP HEADER说HTTP METHOD是DELETE。它似乎不起作用......

2 个答案:

答案 0 :(得分:5)

RewriteCond指令可用。您可以使用它来指定以下规则在特定条件下有效。如果你想通过HTTP请求重写mthod:

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

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

# ...

答案 1 :(得分:3)

  

我可以进行某种混合DELETE和GET吗?

是。在重写规则中,您根本不需要担心请求方法或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 更改网址,不会触及正文。