mod_rewrite:如何重定向HTTP DELETE和PUT

soc*_*qwe 6 php mod-rewrite http http-delete

我试图通过使用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] 
Run Code Online (Sandbox Code Playgroud)

如何为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] 
Run Code Online (Sandbox Code Playgroud)

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

hek*_*mgl 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

# ...
Run Code Online (Sandbox Code Playgroud)


Fab*_*ler 3

我可以混合 DELETE 和 GET 吗?

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

对于您的示例,这意味着:

模组重写

RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)

HTTP请求

PUT /book/1234
=> PUT /book.php?id=1234
Run Code Online (Sandbox Code Playgroud)

PHP脚本

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

进一步说明:GET 参数和 PUT/POST/DELETE 参数之间的区别在于,前者是 URL 的一部分,后者是请求正文的一部分。mod_rewrite 改变URL,不改变body。