我试图通过使用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。它似乎不起作用......
答案 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
仅更改网址,不会触及正文。