6

我试图通过使用 mod_rewrite 在 php 中编写一点休息 api。

我的问题是:如何处理 HTTP DELETE 和 PUT?例如,网址为:/book/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 请求正文来传输参数值。所以我想我需要在 HTTP 请求正文中附加参数。但我不知道如何用 mod_rewrite 做到这一点。

我可以混合使用 DELETE 和 GET 吗?

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

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

4

2 回答 2

5

有一个RewriteCond指令可用。您可以使用它来指定以下规则仅在特定条件下有效。如果您想通过 HTTP 请求方法重写,请像这样使用它:

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

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

# ...
于 2013-02-12T23:40:38.283 回答
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 更改 URL,不触及正文。

于 2013-02-13T12:15:36.977 回答